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的滚动个阻断掉,达不到预期效果
总结的就是这么多,有问题欢迎咨询;