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