美文网首页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