? ? ? ? 說到滑動返回手勢,我想大家肯定不陌生了,從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,這樣就可以了,說不定你有更好的方法,歡迎指正。