要实现的目标

使用默认的滑动返回手势获得极佳的操控体验

  • 1.自定义返回按钮

  • 2.自定义返回按钮后继续使用系统自带手势

发现的问题

UINavigationControllerrootViewController 触发滑动返回的操作后,再调用 pushViewController 时,UINavigationController 失去响应,但是用 Home键 返回手机主界面,然后再次进入应用,发现页面就会push到对应的ViewController 了。原因就是 UINavigationControllerrootViewController 中触发了滑动返回导致的。

解决方案

判断当前的ViewController是不是rootViewController,然后在 - gestureRecognizerShouldBegin:中返回即可。

代码

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if (self.navigationController.viewControllers.count == 1) {
        return NO;
    } else {
        return YES;
    }
}

延伸

如果在pushViewController动画进行的时候过程中触发滑动返回操作,会导致闪退,处理方式也很简单,在 push 之后禁用 interactivePopGestureRecognizer, 在 ViewController 显示之后恢复 interactivePopGestureRecognizer 就可以了。可以使用 method swizzling统一进行处理。

代码

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {  
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;  
}  

-(BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer
 shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer
{
    returnYES;
}