美文网首页ios码皇之路之 iOS
快速实现全屏滑动返回

快速实现全屏滑动返回

作者: 德蒙_托尔斯泰 | 来源:发表于2016-02-19 11:50 被阅读214次

    需求:当页面跳转的时候, 能够全屏滑动返回

    • 完整实现的方法需要自定义全屏手势... 今天说一个快速的解决办法----利用系统自带的滑动返回功能
    • 使用环境:push跳转, 系统自带的只能左侧边缘滑动返回, 不能全平滑
    • 先看效果(蓝色是首页, 滑动蓝色边缘是为了测试 bug, 后面有说):
    全屏滑动.gif

    怎么能够实现全屏滑动, 下面一步步分析

    • 大多数情况下, 我们都会利用apperance来修改navBar的左侧返回Item样式, 替换掉系统原有的
    /** push时,设置leftBtnItem*/
    - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
    //    NSLog(@"%zd", self.childViewControllers.count);
        
        if (self.childViewControllers.count > 0) {
            
            viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageWithRenderingOriginalName:@"NavBack"] style:UIBarButtonItemStylePlain target:self action:@selector(popBack)];
            
            viewController.hidesBottomBarWhenPushed = YES;
        }
        [super pushViewController:viewController animated:animated];
    }
    
    • 但是替换掉系统原有的会造成一个bug, 就是不能滑动返回了, 侧边滑动都不行
    设置back按钮后.gif
    • 分析, 为什么没有滑动效果了
    • 因为我们替换掉了系统原有的 backButtunItem, 导致navgationController中interactivePopGestureRecognizer这个属性的代理失效了, 所以不能滑动返回了
    • 解决:设置interactivePopGestureRecognizer. delegate = nil就可以恢复侧边滑动返回
    • bug:这样会产生一个 bug, 首页侧边滑动的时候会假死
    代理置nil.gif
    • 解决 bug:
      当处于首页时, 我们恢复interactivePopGestureRecognizer的默认代理就不会有这个bug 了
    //判断当前显示的控制器为根控制器时,就启用系统的代理,否则,不启用
    - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
    //    NSLog(@"%@", viewController);
        if (viewController == self.childViewControllers[0]) {
            self.interactivePopGestureRecognizer.delegate = self.interactivePopGesDelegate;
        }else{
            self.interactivePopGestureRecognizer.delegate = nil;
        }
    }
    
    解决假死 bug

    ]

    处理全屏滑动返回

    • 只要将系统的手势替换成我们自己的全屏滑动手势就行了
    • 当然滑动返回的功能还是系统帮我们做, 所以我们我们要拿到系统的滑动返回方法
      • 打印
     id target = self.interactivePopGestureRecognizer.delegate;
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
    //    JJLOG(@"%@", self.interactivePopGestureRecognizer);
        self.interactivePopGestureRecognizer.enabled = NO;
        pan.delegate =self;
        [self.view addGestureRecognizer:pan];
    

    相关文章

      网友评论

      本文标题:快速实现全屏滑动返回

      本文链接:https://www.haomeiwen.com/subject/sfeskttx.html