说到滑动返回手势,我想大家肯定不陌生了,从iOS 7 开始就开始有了,系统默认的是
self.navigationController.interactivePopGestureRecognizer.enabled = YES | NO; 手势有效与否
但是往往我们不会用到系统的,因为我们可能大多数会继承一个导航栏控制器,自己定义全局的导航栏样式,那么系统默认的就不管用了,这时候大家肯定都在熟悉不过了,在写的父类导航栏控制器中,快速的写下如下代码:
// 设置系统的手势返回代理
id target = self.interactivePopGestureRecognizer.delegate;
_pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
[self.view addGestureRecognizer:_pan];
_pan.delegate = self;
//禁用系统的返回手势
self.interactivePopGestureRecognizer.enabled = NO;
// 开启的手势返回
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
// 判断导航控制器的栈内控制器数量,如果只有一个就关闭手势,否则就开启
return (self.viewControllers.count - 1);
}
没错这样是可以了,但是往往这些不能满足我们的要求,说不定你有的界面不需要这个返回手势,也或者是某个界面也用到了这个UIPanGestureRecognizer手势,这时候可能会影响到操作体验,你可能会想到禁用到某个界面的返回手势就行了,你可能会这样写,网上很多这个方法
- (void)viewDidAppear:(BOOL)animated
{
[superviewDidAppear:animated];
// 禁用返回手势
if([self.navigationControllerrespondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled=NO;
}
}这个方法不管用,因为我们已经舍弃掉系统的方法了。
也需你还会这样写,在你需要禁用返回手势的控制器中
- (void)viewDidLoad {
[super viewDidLoad];
id traget = self.navigationController.interactivePopGestureRecognizer.delegate;
UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:traget action:nil];
[self.view addGestureRecognizer:pan];
没错,上面的方法是把滑动返回手势禁用了。可是这同样把UIPanGestureRecognizer手势也禁用了,如果你的界面用到这个手势估计就不行了。
这样写就没有问题,在你的父类导航栏控制器中,代理方法中写上这几句就行了:
// 开启的手势返回
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
// 当前页面是显示结果页,不响应滑动手势
UIViewController *vc = [self.childViewControllers lastObject];
if ([vc isKindOfClass:[GestureViewController class]]||[vc isKindOfClass:[GestureVerifyViewController class]]) {
return NO;
}
// 判断导航控制器的栈内控制器数量,如果只有一个就关闭手势,否则就开启
return (self.viewControllers.count - 1);
return Yes;
}
OK,这样就可以了,说不定你有更好的方法,欢迎指正。