iOS 侧滑返回的那点事

前言

对于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的滑动与侧滑返回并存

https://www.jianshu.com/p/2410c704ba40?from=timeline&isappinstalled=0

猜你喜欢

转载自my.oschina.net/u/2345393/blog/1815936