學習目的:
*解決重寫navigationItem.leftBarButtonItem導致系統(tǒng)自動右滑返回手勢失效.
實現(xiàn)效果:
在push后的控制器中,通過右滑手勢返回上一個控制器,不僅僅在屏幕邊緣能實現(xiàn)返回(在屏幕中間右滑也能返回).
1.在自定義的導航控制器viewDidLoad方法中實現(xiàn):
- (void)viewDidLoad {
[super viewDidLoad];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
[self.view addGestureRecognizer:pan];
// 控制手勢什么時候觸發(fā),只有非根控制器才需要觸發(fā)手勢
pan.delegate = self;
// 禁止之前手勢
self.interactivePopGestureRecognizer.enabled = NO;
}
2.解決返回到根控制器界面,再繼續(xù)右滑導致卡死的Bug:
2.1.遵守UIGestureRecognizerDelegate協(xié)議
@interface FitfunNavigationController ()<UIGestureRecognizerDelegate>
2.2.實現(xiàn)代理協(xié)議方法
#pragma mark - UIGestureRecognizerDelegate
// 決定是否觸發(fā)手勢
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
return self.childViewControllers.count > 1;
}
3.重寫UINavigationController的方法(- pushViewController: animated:):
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (self.childViewControllers.count > 0) { // 非根控制器
viewController.hidesBottomBarWhenPushed = YES;
// 設置返回按鈕,只有非根控制器
viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem fitfun_backItemWithimage:[UIImage imageNamed:@"navigationButtonReturn"] highImage:[UIImage imageNamed:@"navigationButtonReturnClick"] target:self action:@selector(back) title:@"返回"];
}
// 真正在跳轉
[super pushViewController:viewController animated:animated];
}
- (void)back
{
[self popViewControllerAnimated:YES];
}