对于iOS用户来讲,右滑返回是一个比较常见的。那么对于一个开放者来讲,怎么去实现?其中又有哪些坑呢?app
1.边缘触发侧滑(苹果原生)
2.全屏触发侧滑动画
1.系统自带(不自定义导航)
2.使用系统动画去实现
3.自定义导航,默认开启系统的返回手势
参考文章:
iOS侧滑返回的三种实现方式spa
至于两种侧滑效果孰好孰坏没有办法说,这就须要根据公司的产品需求去衡量。
对于全屏手势的最简便的实现方式就是定义一个全屏手势,其实现方式仍是去取系统的左滑手势(@select(handleNavigationTransition:))实现。code
Bug描述:当app集成了侧滑返回手势,在根目录侧滑手势,再任意点击push新的控制器,页面卡死。
解决过程:用view去分层查看会看到新控制器是push出来的。但页面上却没有。
解决方法:禁用根目录下的侧滑手势。rem
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if ( gestureRecognizer == self.interactivePopGestureRecognizer ) { UIViewController *vc = self.viewControllers.lastObject; // 禁用某些不支持侧滑返回的页面 if ([vc isKindOfClass:[OpenContainerDoorVC class]]) { return NO; } // 禁用根目录的侧滑手势 if ( self.viewControllers.count < 2 || self.visibleViewController == [self.viewControllers objectAtIndex:0] ) { return NO; } } return YES; }
Bug描述:当从扫码页面跳到新页面时,侧滑返回就又回到扫码页面,但实际但愿到扫码的上一个页面。
解决过程:咱们知道navigation是有viewControllers这样一个压栈出栈的属性的。那么假如能够修改其中的控制器的顺序或者增删控制器,天然能够完美解决这个问题。
解决方法:get
NSMutableArray *VCs = [NSMutableArray arrayWithArray: self.navigationController.viewControllers]; // 剔除想要移除的控制器 [VCs removeObject:self]; [self.navigationController setViewControllers:VCs];
Bug描述:当当前页面最底层是scrollView时,侧滑手势失效问题。
解决思路:当在边缘时,禁用scrollView的滑动手势。
解决方法:产品
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if ([otherGestureRecognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) { if (gestureRecognizer.state != UIGestureRecognizerStatePossible) { return YES; } } return NO; }
后来看到一篇更好的文章去处理这方面的问题,此处记录一二。
一行代码,让你的应用中UIScrollView的滑动与侧滑返回并存it
https://www.jianshu.com/p/2410c704ba40?from=timeline&isappinstalled=0io