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