UIScrollView嵌套TableView手势冲突问题

1、 UIScrollView里面嵌套两个tableView,右边一个tableView 又要实现左滑删除功能,写好左滑删除的代理方法,准备调试... 发现tableView左滑失效了,调试发现原来是UIScrollView的滑动手势和tableView的左滑手势冲突了。

2、写了一个继承UISrollViewMyScrollView,在里面重写

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
  NSLog(@"_____%@______other:%@",gestureRecognizer,otherGestureRecognizer);
return NO;
}

(上面方法是UIGestureRecognizerDelegate有两个没公开的函数之一,只要重载了就会被调用,是可以通过appstore审核的)
调试输出发现 return NO会忽略otherGestureRecognizer 手势(被拦截) ;return YES则会调用 otherGestureRecognizer的方法(不拦截);但是需求是cell左滑的手势可以执行,而不是所有的手势;单纯的return YES会造成UISrollView 无法左右滑动。

3、知道上面的的问题,那我们只需要判断 如果otherGestureRecognizercell左滑的手势 return yes 即可,其他return no。 通过调试打印发现

___; target= <(action=handlePan:, target=)>; must-fail = {
        ; target= <(action=_handleSwipe:, target=)>>
    }>______other:; targets= <(
    "(action=handlePan:, target=)",
    "(action=handleSwipeBeginning:, target=)"
)>>
2016-07-14 14:53:32.463 antQueen[7614:3034218] ___; target= <(action=handlePan:, target=)>; must-fail = {
        ; target= <(action=_handleSwipe:, target=)>>
    }>______other:; target= <(action=delayed:, target=)>>
2016-07-14 14:53:32.472 antQueen[7614:3034218] ___; target= <(action=handlePan:, target=)>; must-fail = {
        ; target= <(action=_handleSwipe:, target=)>>
    }>______other:; target= <(action=delayed:, target=)>>

我们发现其中有个UITableViewWrapperView这个就是我们要找的view,然后我们在方法里面做个判断:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UITableViewWrapperView")]) {
        return YES;
    }
    NSLog(@"_____%@______other:%@",gestureRecognizer,otherGestureRecognizer);
    return NO;
}

大功告成...调试发现cell可以实现左滑。

通过上面的私有方法,也可以去解决UIScrollView滑动与UINavigationVIewController的手势返回的冲突(自己研究下吧!)

你可能感兴趣的:(UIScrollView嵌套TableView手势冲突问题)