如何给全局添加滑动返回手势及解除某个界面的滑动返回手势

        说到滑动返回手势,我想大家肯定不陌生了,从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,这样就可以了,说不定你有更好的方法,欢迎指正。

你可能感兴趣的:(如何给全局添加滑动返回手势及解除某个界面的滑动返回手势)