iOS 配置全局侧滑返回手势

其实如果使用系统的返回按钮,不用leftBarButtonItem或者leftBarButtonItems进行自定义,那么系统会自带侧滑返回功能。但是在实际的开发中都会按照自己的需求对返回按钮进行自定义,如果通过上边两种方式进行自定义了,或者在当前的视图中添加了UIScrollView等滚动视图后侧滑返回的手势就会自动失效。因为如此便会覆盖原有的侧滑返回手势的代理,所以我的解决思路是重新给UINavigationController添加代理

1 创建一个继承于UINavigationController的类作为全局的导航控制器,然后在里边添加侧滑代理

- (void)viewDidLoad {
    [super viewDidLoad];
    // 重新设置侧滑手势的代理
    __weak typeof(self) weakSelf = self;
    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.interactivePopGestureRecognizer.delegate = (id)weakSelf;
    }
}

2 设置完成之后所有在该导航控制器下的ViewController就有了侧滑的返回功能,但是如果是根控制器侧滑就会出现问题,当我在根控制器侧滑之后想再次push出新的控制器后就会失效。如果根控制器侧滑三次则需要push四次之后才可以出现新的视图,所以要通过手势的代理方法对根控制器的侧滑手势进行处理

// 开始接收到手势的代理方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    // 判断是否是侧滑相关的手势
    if (gestureRecognizer == self.interactivePopGestureRecognizer) {
        // 如果当前展示的控制器是根控制器就不让其响应
        if (self.viewControllers.count < 2 ||
            self.visibleViewController == [self.viewControllers objectAtIndex:0]) {
            return NO;
        }
    }
    return YES;
}

3 此时可以说已经完成了大部分的全局侧滑返回手势,但是如果在当前视图添加了UIScrollView等滚动视图后会发现侧滑功能消失了,因为滚动视图可以接收并响应侧滑手势,该手势就传递不到导航控制了,所以想要在存在滚动视图的控制器也存在侧滑返回功能就要对多手势事件进行处理

// 接收到多个手势的代理方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    // 判断是否是侧滑相关手势
    if (gestureRecognizer == self.interactivePopGestureRecognizer && [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
        UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
        CGPoint point = [pan translationInView:self.view];
        // 如果是侧滑相关的手势,并且手势的方向是侧滑的方向就让多个手势共存
        if (point.x > 0) {
            return YES;
        }
    }
    return NO;
}

备注:

调用此方法禁用侧滑返回功能

[self.navigationController.interactivePopGestureRecognizer setEnabled:NO];

此方法将会把navigationController后边的所有ViewController侧滑手势禁用,所以我推荐在所有ViewController基类的viewDidLoad中开启全局的侧滑功能,然后在相应禁止侧滑的控制器中的viewDidAppear中禁止侧滑。


记住一定要在viewDidAppear中禁止,如果在viewWillAppear中禁止当你push到下一个界面中再用侧滑返回的时候会先走上一个控制器的viewWillAppear将其侧滑禁止,导致下一个界面也会失去侧滑功能
如果理解不了多看一下控制器的生命周期


猜你喜欢

转载自blog.csdn.net/blueCat_1128/article/details/80236816