iOS 7中在传统的左上角返回键之外,提供了右滑返回上一级界面的手势。支持此手势的是UINavigationController中新增的属性interactivePopGestureRecognizer,即右滑返回只支持以UINavigationController为容器的ViewController间切换,要想在自定义容器中使用,需要一些额外的工作。
基本地,控制ViewController是否启用右滑返回,只需要这样:
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
默认情况下enabled为YES。
在实际使用中,遇到了一些问题,整理如下:
1、自定义返回按钮后,右滑返回失效;
解决方案:比较直观的办法是在自定义返回按钮时,使用backBarButtonItem:
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
self.navigationItem.leftBarButtonItem = barItem; //not working
self.navigationItem.backBarButtonItem = barItem; //serve well
但这样无法支持左上角多个按钮的情况。考虑到 interactivePopGestureRecognizer也有delegate属性, 替换默认的 self . navigationController .interactivePopGestureRecognizer.delegate来配置右滑返回的表现也是可行的。在主ViewController中:
self.navigationController.interactivePopGestureRecognizer.delegate = self;
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if (self.navigationController.viewControllers.count == 1) {
//关闭主界面的右滑返回
return NO;
}
else {
return YES;
}
}
如此做的好处是可以在主ViewController中配置栈中所有ViewController右滑返回的开启,而不需要在各个ViewController中分别设置enabled。
值得注意的是:在替换了delegate之后,必须在gestureRecognizerShouldBegin:中设置某ViewController A开启右滑返回,同时在A中未设置interactivePopGestureRecognizer.enabled = NO,右滑返回才会开启,即二者中任一为NO,右滑返回都处于关闭状态。
2、主界面(UINavigationController栈中的第一个ViewController)默认也是开启右滑返回的。若在主界面上右滑,不会有动作执行。但此时想进入下一级ViewController(如点击tableView中某一行),切换动画却没有出现。切回桌面再进入应用,发现直接进入了下一级ViewController。
解决方案:这个问题是在最初试验右滑返回的使用方式时出现的。在使用自定义返回按钮的ViewController中
self.navigationController.interactivePopGestureRecognizer.delegate = self;