美文网首页
TableView左滑删除和ScrollView左右滚动手势冲突

TableView左滑删除和ScrollView左右滚动手势冲突

作者: 骑马纵天下 | 来源:发表于2019-06-27 14:00 被阅读0次

一般情况下不支持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 falseotherGestureRecognizer手势会被忽略也就是tableView的左滑删除手势。当return trueotherGestureRecognizer手势不会被忽略,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;
    }
}

相关文章

网友评论

      本文标题:TableView左滑删除和ScrollView左右滚动手势冲突

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