- 本文由 Chawler(github)翻譯
- 作者:@takashings
- 原文:UINavigationControllerのスワイプで戻るを有効?無効にする方法
設(shè)置導(dǎo)航欄的左側(cè)按鈕會導(dǎo)致滑動返回失效。
UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_button_image"]
style:UIBarButtonItemStylePlain
target:self
action:@selector(backButtonTapped:)];
self.navigationItem.leftBarButtonItem = backButtonItem;
想要在返回到上一個畫面之前做一些特別處理的話,就要按照我上述的方式來設(shè)置左側(cè)按鈕。
但是,要啟用滑動返回的話,必須按照正確的方法來寫。
這個時候就該這么寫啦。
@interface ViewController : UIViewController <UIGestureRecognizerDelegate>
self.navigationController.interactivePopGestureRecognizer.delegate = self;
這樣的話滑動返回就有效果了呢。
在viewDidLoad:或者viewWillAppear:調(diào)用都是可以的。
不過是不兼容iOS6和iOS6以下的,如果要支持的話就得另外封裝了。
禁用滑動返回
相反的,滑動返回無效的設(shè)置方法在這里。
通常把返回值設(shè)為NO就可以來啦。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
return NO;
}
根據(jù)條件來判斷是否啟用滑動返回
打比方說,在不需要編輯的時候使滑動返回有效,需要編輯的時候使滑動返回?zé)o效的情況下,我覺得應(yīng)該要這樣寫的吧。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
// 編輯flag為打開時使滑動返回?zé)o效
if(self.Edit) {
return NO;
} else {
return YES;
}
}
自己封裝滑動返回從禁用恢復(fù)到原始的情況
基本上來說iOS的滑動返回都是有效的,只有在特定的界面隱藏返回按鈕,想要通過自己來封裝的情況下,就是這種模式了。
界面1
↓ ↑
界面2
↓ ↑
界面3
導(dǎo)航欄的左側(cè)按鈕獨立封裝
設(shè)置self.navigationController.interactivePopGestureRecognizer.delegate
↓ ↑
界面4
為什么從界面2回到界面1的時候活動返回會無效了呢?
界面3中對于self.navigationController.interactivePopGestureRecognizer的封裝不夠完善才會出現(xiàn)這種情況。
所以呢,這種情況就應(yīng)該這么寫了。
- (void)viewWillAppear:(BOOL)animated {
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
- (void)viewWillDisappear:(BOOL)animated {
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
}
關(guān)鍵點是設(shè)置nil的時機在viewWillDisappear:的位置上
在viewDidDisappear:設(shè)置的話是沒有效果的,必須在畫面關(guān)閉之前設(shè)置好。