? ? ? ? 說到滑動返回手勢禁炒,我想大家肯定不陌生了廓块,從iOS ?7 開始就開始有了秋度,系統(tǒng)默認的是
self.navigationController.interactivePopGestureRecognizer.enabled = YES | NO;? ? ? 手勢有效與否
但是往往我們不會用到系統(tǒng)的瓶盛,因為我們可能大多數(shù)會繼承一個導(dǎo)航欄控制器都伪,自己定義全局的導(dǎo)航欄樣式呕乎,那么系統(tǒng)默認的就不管用了,這時候大家肯定都在熟悉不過了陨晶,在寫的父類導(dǎo)航欄控制器中猬仁,快速的寫下如下代碼:
// 設(shè)置系統(tǒng)的手勢返回代理
id target = self.interactivePopGestureRecognizer.delegate;
_pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
[self.view addGestureRecognizer:_pan];
_pan.delegate = self;
//禁用系統(tǒng)的返回手勢
self.interactivePopGestureRecognizer.enabled = NO;
// 開啟的手勢返回
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
// 判斷導(dǎo)航控制器的棧內(nèi)控制器數(shù)量,如果只有一個就關(guān)閉手勢先誉,否則就開啟
return (self.viewControllers.count - 1);
}
沒錯這樣是可以了湿刽,但是往往這些不能滿足我們的要求,說不定你有的界面不需要這個返回手勢褐耳,也或者是某個界面也用到了這個UIPanGestureRecognizer手勢诈闺,這時候可能會影響到操作體驗,你可能會想到禁用到某個界面的返回手勢就行了铃芦,你可能會這樣寫雅镊,網(wǎng)上很多這個方法
- (void)viewDidAppear:(BOOL)animated
{
[superviewDidAppear:animated];
//?禁用返回手勢
if([self.navigationControllerrespondsToSelector:@selector(interactivePopGestureRecognizer)])?{
self.navigationController.interactivePopGestureRecognizer.enabled=NO;
}
}這個方法不管用,因為我們已經(jīng)舍棄掉系統(tǒng)的方法了刃滓。
也需你還會這樣寫仁烹,在你需要禁用返回手勢的控制器中
- (void)viewDidLoad {
[super viewDidLoad];
id traget = self.navigationController.interactivePopGestureRecognizer.delegate;
UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:traget action:nil];
[self.view addGestureRecognizer:pan];
沒錯,上面的方法是把滑動返回手勢禁用了咧虎∽跨郑可是這同樣把UIPanGestureRecognizer手勢也禁用了,如果你的界面用到這個手勢估計就不行了。
這樣寫就沒有問題征唬,在你的父類導(dǎo)航欄控制器中震叮,代理方法中寫上這幾句就行了:
// 開啟的手勢返回
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
// 當前頁面是顯示結(jié)果頁,不響應(yīng)滑動手勢
UIViewController *vc = [self.childViewControllers lastObject];
if ([vc isKindOfClass:[GestureViewController class]]||[vc isKindOfClass:[GestureVerifyViewController class]]) {
? ? return NO;
}
// 判斷導(dǎo)航控制器的棧內(nèi)控制器數(shù)量鳍鸵,如果只有一個就關(guān)閉手勢,否則就開啟
return (self.viewControllers.count - 1);
return ?Yes;
}
OK尉间,這樣就可以了偿乖,說不定你有更好的方法,歡迎指正哲嘲。