美文网首页iOS开发技术
UIScrollView嵌套TableView手势冲突问题

UIScrollView嵌套TableView手势冲突问题

作者: 实验室小白鼠 | 来源:发表于2016-07-14 17:09 被阅读2613次

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。 通过调试打印发现

___<UIScrollViewPanGestureRecognizer: 0x138081870; state = Possible; delaysTouchesEnded = NO; view = <ANTScrollView 0x1370e9400>; target= <(action=handlePan:, target=<ANTScrollView 0x1370e9400>)>; must-fail = {
        <UIScrollViewPagingSwipeGestureRecognizer: 0x138014430; state = Failed; view = <ANTScrollView 0x1370e9400>; target= <(action=_handleSwipe:, target=<ANTScrollView 0x1370e9400>)>>
    }>______other:<UIScrollViewPanGestureRecognizer: 0x1380175c0; state = Possible; cancelsTouchesInView = NO; delaysTouchesEnded = NO; view = <UITableViewWrapperView 0x1370cec00>; targets= <(
    "(action=handlePan:, target=<UITableViewWrapperView 0x1370cec00>)",
    "(action=handleSwipeBeginning:, target=<UITableViewWrapperView 0x1370cec00>)"
)>>
2016-07-14 14:53:32.463 antQueen[7614:3034218] ___<UIScrollViewPanGestureRecognizer: 0x138081870; state = Possible; delaysTouchesEnded = NO; view = <ANTScrollView 0x1370e9400>; target= <(action=handlePan:, target=<ANTScrollView 0x1370e9400>)>; must-fail = {
        <UIScrollViewPagingSwipeGestureRecognizer: 0x138014430; state = Failed; view = <ANTScrollView 0x1370e9400>; target= <(action=_handleSwipe:, target=<ANTScrollView 0x1370e9400>)>>
    }>______other:<UIScrollViewDelayedTouchesBeganGestureRecognizer: 0x13807a5a0; state = Possible; delaysTouchesBegan = YES; view = <UITableView 0x13703f000>; target= <(action=delayed:, target=<UITableView 0x13703f000>)>>
2016-07-14 14:53:32.472 antQueen[7614:3034218] ___<UIScrollViewPanGestureRecognizer: 0x138081870; state = Possible; delaysTouchesEnded = NO; view = <ANTScrollView 0x1370e9400>; target= <(action=handlePan:, target=<ANTScrollView 0x1370e9400>)>; must-fail = {
        <UIScrollViewPagingSwipeGestureRecognizer: 0x138014430; state = Failed; view = <ANTScrollView 0x1370e9400>; target= <(action=_handleSwipe:, target=<ANTScrollView 0x1370e9400>)>>
    }>______other:<UIScrollViewDelayedTouchesBeganGestureRecognizer: 0x136db8360; state = Possible; delaysTouchesBegan = YES; view = <ANTScrollView 0x1370e9400>; target= <(action=delayed:, target=<ANTScrollView 0x1370e9400>)>>

我们发现其中有个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的手势返回的冲突(自己研究下吧!)

相关文章

网友评论

  • roylly:这个根本不是什么私有方法。就是手势识别的代理方法,这是个典型的手势识别冲突问题。
    @protocol UIGestureRecognizerDelegate <NSObject>
    @optional
    // note: returning YES is guaranteed to set up the failure requirement. returning NO does not guarantee that there will not be a failure requirement as the other gesture's counterpart delegate or subclass methods may return YES
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);
  • EagleOne:不用重写私有的。。。重写下gestureRecognizerShouldBegin就好了

本文标题:UIScrollView嵌套TableView手势冲突问题

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