问题描述:
在scrollView中创建了多个VC,VC中有tableView,这时发现tableViewCell的滑动删除不能用,滑动没有反应
于是查了一下,发现了scrollView的两个属性,delaysContentTouches和canCancelContentTouches
首先,scrollView有一个属性tracking(跟踪),它用来确定用户是不是打算开始滚动scrollView,这个描述非常玄学,它是这么确定的:
点击到屏幕时,scrollView拦截点解事件,tracking设置为YES.这时会启动一个计时,150ms内,如果手指发生移动,tracking变为NO,并且scrollView开始滑动,scrollView的子视图不再响应本次事件;如果手指没有发生移动,tracking保持YES,并且不会滚动,此时如果touch到了可响应的子视图,那么该子视图会响应.
delaysContentTouches 默认是YES,如果设置为NO,那么无论手指在150ms内是不是移动了,子视图都会响应.
canCancelContentTouches 默认为YES,就会等待用户下一步动作,如果用户移动手指到一定距离,就会把这个操作作为滚动来处理并开始滚动,同时发送一个touchesCancelled:withEvent:消息给内容控件,由控件自行处理。如果为NO,当跟踪时,如果有子视图可以响应,就不会等待用户下一步动作,直接发送touchesCancelled:withEvent:,并且不会触发scrollView的滚动.
但是发现并不能解决tableViewCell的滑动问题.
一个解决方案是这样,上述过程是发生在scrollView重写的hitTest里的,自定义一个scrollView的子类.
重写hitTest:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
if ([view.superview isMemberOfClass:NSClassFromString(@"xxxxx")]){
self.scrollEnabled = NO;
}else{
self.scrollEnabled = YES;
}
return view;
}
当扫过 UITableViewCell时,子视图UITableViewCellContentView会响应,此时scrollView关闭滑动,可以比较完美的实现想要的效果