iOS系统 POP 手势与 UIScrollView 手势冲突的解决方法

问题:

在某应用中,DetailViewController 是从 HomeViewController push进去的,使用到 github 上开源的 FDFullscreenPopGesture 做手势返回,但是在 DetailViewController 中手势返回并未生效。

简单分析:

看了下页面的内容,UIViewController 中是有放了一个 UIScrollView。操作过程中,在手指向右滑动,UIScrollView 滑动到最左边的时候,按照期望应该是滑动返回手势生效。实际上 UIScrollView 的 PanGestureRecognizer 与 ViewController 的 fd_fullscreenPopGestureRecognizer 产生了冲突,两者都是 Pan 手势,到 UIScrollView 这一层的时候,就没有继续往下方继续传递了,导致滑动返回手势失效。那是不是当 UIScrollView 滑动到了最左边(ContentOffset 的 x 为 0)的时候,继续让 ViewController 的 fd_fullscreenPopGestureRecognizer 继续生效就可以了?试一试吧!

新建一个 JJSScrollView 继承 UIScrollView,重写 gestureRecognizer:(UIGestureRecognizer)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer)otherGestureRecognizer

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    // 判断 otherGestureRecognizer 是不是系统 POP 手势
    if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {
        // 判断 POP 手势的状态是 begin 还是 fail,同时判断 scrollView 的 ContentOffset.x 是不是在最左边
        if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan && self.contentOffset.x == 0) {
            return YES;
        }
    }
    return NO;
}

结果:

将 UIViewController 中的 UIScrollView 改为自定义的 JJSScrolView,重新运行应用。滑动 UIScrollView 到最左侧,继续向左滑动,返回手势正常。问题解决!

写在最后

欢迎大家加我好友,一起探讨 iOS 开发相关的知识,如果你在开发过程中遇到什么 bug,也可以发给我一起解决。

你可能感兴趣的:(iOS系统 POP 手势与 UIScrollView 手势冲突的解决方法)