自定義返回按鈕保留系統(tǒng)滑動返回手勢.gif
1.簡介
使用蘋果手機,最喜歡的就是用它的滑動返回.作為一個開發(fā)者,我們在編寫很多頁面的時候,總是會因為這樣那樣的原因使得系統(tǒng)的滑動返回不可用.使用導航欄push出一個控制器,我們在控制器中自定義了一個返回按鈕.這樣系統(tǒng)默認的滑動返回手勢效果就沒有了.
2.解決方法
[1]從A這個控制器push到B這個控制器,我們想要自定義B的返回按鈕,我們可以在A中設置
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"王儼" style:UIBarButtonItemStylePlain target:nil action:nil];
[2]在B控制器設置返回按鈕,我想這應該是大多數人喜歡的選擇,可是當我們在B控制器中設置self.navigationItem.leftBarButtonItem
后發(fā)現系統(tǒng)的滑動返回手勢失效了.那么如何可以保留系統(tǒng)的滑動返回手勢了,我們可以B控制器中這樣做.
@interface ViewController () <UIGestureRecognizerDelegate>
@end
@implementation ViewController {
id<UIGestureRecognizerDelegate> _delegate
}
- (void)viewDidLoad {
[super viewDidLoad];
// 自定義返回按鈕
UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 44, 44)];
[button setTitle:@"王儼2" forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button addTarget:self action:@selector(back:) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:button];
}
- (void)back:(UIButton *)button {
[self.navigationController popViewControllerAnimated:YES];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (self.navigationController.viewControllers.count > 1) {
// 記錄系統(tǒng)返回手勢的代理
_delegate = self.navigationController.interactivePopGestureRecognizer.delegate;
// 設置系統(tǒng)返回手勢的代理為當前控制器
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// 設置系統(tǒng)返回手勢的代理為我們剛進入控制器的時候記錄的系統(tǒng)的返回手勢代理
self.navigationController.interactivePopGestureRecognizer.delegate = _delegate;
}
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
return self.navigationController.childViewControllers.count > 1;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return self.navigationController.viewControllers.count > 1;
}
@end