一般情况下不支持scrollView嵌套tableView时还支持左滑删除。
原因:
根源是手势冲突,当tableView支持左滑删除时会和scrollView的左右滚动手势冲突。解决办法就是当手势触碰的是cell时,让左滑删除手势不被拦截。
解决办法:
1. 新建个继承UIScrollView的子类,重写shouldRequireFailureOfGestureRecognizer
方法,当触碰的是cell时手势不被拦截。这个方法只有在重写UIScrollView时才会调用,实测。此方法默认return false
。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
NSLog(@"gestureRecognizer == %@otherGestureRecognizer == %@",gestureRecognizer,otherGestureRecognizer);
return false;
}
通过打断点发现当上面的方法return false
时otherGestureRecognizer
手势会被忽略也就是tableView的左滑删除手势。当return true
时otherGestureRecognizer
手势不会被忽略,tableView可以左滑删除。但是scrollView的左右滚动手势被忽略了。所以只需判断当手势触碰的是cell是return true
不是return false
。
<UIScrollViewPanGestureRecognizer: 0x1380175c0; state = Possible; cancelsTouchesInView = NO; delaysTouchesEnded = NO; view = <UITableViewWrapperView 0x1370cec00>; targets= <(
"(action=handlePan:, target=<UITableViewWrapperView 0x1370cec00>)",
"(action=handleSwipeBeginning:, target=<UITableViewWrapperView 0x1370cec00>)"
)
2. 通过UITableViewWrapperView
判断触碰的是否是cell。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UITableViewWrapperView")]) {
return YES;
}
NSLog(@"gestureRecognizer == %@otherGestureRecognizer == %@",gestureRecognizer,otherGestureRecognizer);
return NO;
}
另一个解决办法通过点击的位置来判断是左右滚动还是左滑删除。
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
UIView *resultView = [super hitTest:point withEvent:event];
if (resultView) {
/*
resultView为nil说明不再在view上,不作处理
不为nil,则进行下面处理
*/
if (resultView != self) {
/*
如果响应resultView不是UIScrollView,则根据用户滑动位置来确定
是self的子视图(tableView)侧滑
还是self本身(scrollView)滚动
*/
int count = (int)point.x / (int)([UIScreen mainScreen].bounds.size.width);
CGFloat res = point.x - ([UIScreen mainScreen].bounds.size.width)*count;
if (res > ([UIScreen mainScreen].bounds.size.width - 100)) {
//在屏幕右边缘(100以内,自己可根据情况修改)位置,则认为是tableView侧滑
self.scrollEnabled = NO;
//这里只是暂时设置self不可滑动,但是最佳响应这并没有改变
return resultView;
}else{
//在屏幕左侧或者中间位置,则认为是self滚动
self.scrollEnabled = YES;
return resultView;
}
}else{
//如果self是,则恢复滑动
self.scrollEnabled = YES;
return resultView;
}
}else{
return nil;
}
}
网友评论