UITableView与UITouch事件的冲突

2018-08-06  本文已影响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的滚动个阻断掉,达不到预期效果


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

上一篇下一篇

猜你喜欢

热点阅读