iOS 侧滑返回的那点事
2018-05-21 本文已影响69人
雪中夜归人
前言
对于iOS用户来说,右滑返回是一个比较常见的。那么对于一个开放者来说,怎么去实现?其中又有哪些坑呢?
目前的侧滑效果有两种:
1.边缘触发侧滑(苹果原生)
2.全屏触发侧滑
而实现目前有三种方式:
1.系统自带(不自定义导航)
2.使用系统动画去实现
3.自定义导航,默认开启系统的返回手势
参考文章:
iOS侧滑返回的三种实现方式
正文
至于两种侧滑效果孰好孰坏没有办法说,这就需要根据公司的产品需求去衡量。
对于全屏手势的最简便的实现方式就是定义一个全屏手势,其实现方式还是去取系统的左滑手势(@select(handleNavigationTransition:))实现。
重点坑
坑点一
Bug描述:当app集成了侧滑返回手势,在根目录侧滑手势,再任意点击push新的控制器,页面卡死。
解决过程:用view去分层查看会看到新控制器是push出来的。但页面上却没有。
解决方法:禁用根目录下的侧滑手势。
- (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这样一个压栈出栈的属性的。那么假如可以修改其中的控制器的顺序或者增删控制器,自然可以完美解决这个问题。
解决方法:
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的滑动与侧滑返回并存
后记
每天进步一点点!!!加油!!!