问题:
在某应用中,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,也可以发给我一起解决。