美文网首页
UITableView与UITouch事件的冲突

UITableView与UITouch事件的冲突

作者: 莪的世界木有如果 | 来源:发表于2018-08-06 17:39 被阅读207次

    在开发过程中会遇到在UITableView或UIScrollView上面滑动,但是会发现下面的方法不会执行,或者只会执行一次,这样就起不到应有的作用,那么怎么样才能在UITableView上面实现touch的事件呢,比如一个UIBezierPath路劲跟随滑动的距离改变。

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
    - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
    - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
    

    第一步:我们先创建一个继承于UITableView的子类TouchTableView(这里是继承,不是分类)

    第二步:在TouchTableView.h中实现下面代码:

    声明代理:

    @protocol TouchTableViewDelegate<NSObject>
    
    @optional
    - (void)tableView:(UITableView *)tableView
         touchesBegan:(NSSet *)touches
            withEvent:(UIEvent *)event;
    
    - (void)tableView:(UITableView *)tableView
     touchesCancelled:(NSSet *)touches
            withEvent:(UIEvent *)event;
    
    - (void)tableView:(UITableView *)tableView
         touchesEnded:(NSSet *)touches
            withEvent:(UIEvent *)event;
    
    - (void)tableView:(UITableView *)tableView
         touchesMoved:(NSSet *)touches
            withEvent:(UIEvent *)event;
    
    @end
    

    声明属性:

    @interface TouchTableView : UITableView
    {
    @private __weak id _touchDelegate;
    
    }
    /*注释*/
    @property (nonatomic,weak) id<TouchTableViewDelegate> touchDelegate;
    @end
    

    接下来在TouchTableView.m文件中,实现UITouch相关的方法,如下面这些方法

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
    - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
    - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
    

    在这些方法里面调用代理方法,

    @synthesize touchDelegate = _touchDelegate;
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        [super touchesBegan:touches withEvent:event];
        if ([_touchDelegate conformsToProtocol:@protocol(TouchTableViewDelegate)] && [_touchDelegate respondsToSelector:@selector(tableView:touchesBegan:withEvent:)]) {
            [_touchDelegate tableView:self touchesBegan:touches withEvent:event];
        }
    }
    - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        [super touchesMoved:touches withEvent:event];
        if ([_touchDelegate conformsToProtocol:@protocol(TouchTableViewDelegate)] && [_touchDelegate respondsToSelector:@selector(tableView:touchesMoved:withEvent:)]) {
            [_touchDelegate tableView:self touchesMoved:touches withEvent:event];
        }
    }
    -(void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        [super touchesCancelled:touches withEvent:event];
        if ([_touchDelegate conformsToProtocol:@protocol(TouchTableViewDelegate)] && [_touchDelegate respondsToSelector:@selector(tableView:touchesCancelled:withEvent:)]) {
            [_touchDelegate tableView:self touchesCancelled:touches withEvent:event];
        }
    }
    - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        [super touchesEnded:touches withEvent:event];
        if ([_touchDelegate conformsToProtocol:@protocol(TouchTableViewDelegate)] && [_touchDelegate respondsToSelector:@selector(tableView:touchesEnded:withEvent:)]) {
            [_touchDelegate tableView:self touchesEnded:touches withEvent:event];
        }
    }
    

    第三步:在viewController里先创建个TouchTableView的属性tableView,设置代理tableView.touchDelegate = self;

    /*注释*/
    @property (nonatomic,strong) TouchTableView *tableView;
    
    /*懒加载*/
    - (UITableView *)tableView
    {
        if(!_tableView){
            _tableView = [[TouchTableView alloc] initWithFrame:CGRectMake(0, 64, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height) style:UITableViewStylePlain];
            _tableView.delegate = self;
            _tableView.dataSource = self;
            _tableView.touchDelegate = self;
        }
        return _tableView;
    }
    

    实现代理:

    - (void)tableView:(UITableView *)tableView touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
        nslog(@"began");
    }
    
    - (void)tableView:(UITableView *)tableView touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
            nslog(@"moved");
    }
    
    - (void)tableView:(UITableView *)tableView touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
         nslog(@"touch end");
    }
    

    注意

    这里最好在touchesBegan的时候,让

    self.tableView.scrollEnable = false;

    然后在touchesEnd的时候,让

    self.tableView.scrollEnable = true;

    这么做的原因是为了避免在想要实现滑动效果的时候,会被uitableview的滚动个阻断掉,达不到预期效果


    总结的就是这么多,有问题欢迎咨询;

    相关文章

      网友评论

          本文标题:UITableView与UITouch事件的冲突

          本文链接:https://www.haomeiwen.com/subject/hvpgvftx.html