由于系统的返回按钮看起来很丑,不符合我们项目的设计稿,需要自定义返回按钮,那么问题来了,新手自定义返回按钮后,往往会遇到右滑不能自动返回了,看到网上很多小伙伴提供方法解决这个问题,但是多多少少会有一些奇怪的问题出现。
比如最多的这个解决方案:如果你的项目中有一个基类baseViewController,你可以只在这个基类里面添加如下代码:(这个代码有个坑就是滑动多次后界面会莫名其妙的卡死)
@interface BaseViewController ()
@property(nonatomic,weak)id delegate;
@end
@implementationBaseViewController
- (void)viewWillAppear:(BOOL)animated {
[superviewWillAppear:animated];
if (self.navigationController.viewControllers.count > 1) {
// 记录系统返回手势的代理
_delegate = self.navigationController.interactivePopGestureRecognizer.delegate;
// 设置系统返回手势的代理为当前控制器
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// 设置系统返回手势的代理为我们刚进入控制器的时候记录的系统的返回手势代理
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
添加上面这个代码后,运行,发现好像真的解决了问题,但是你会发现当你操作多次滑动返回,切换等等,界面会莫名其妙的卡死,点哪里都不动了。这个具体原因我也不清楚,猜测是自己设置的代理以及对代理的相关操作与系统的冲突了。
其次,还有这个方案,就是禁用系统的手势,自己再去添加一个手势,代码如下:(这个方案带来的坑是如果你有对表的左滑删除,这个时候它会变的不灵敏,滑动删除变成了一个随机事件)
@interface NavigationController ()
@end
@implementationNavigationController
- (void)viewDidLoad {
[super viewDidLoad];
id target = self.interactivePopGestureRecognizer.delegate;
// 禁止系统的手势
self.interactivePopGestureRecognizer.enabled = NO;
SEL handleTransition = NSSelectorFromString(@"handleNavigationTransition:");
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:handleTransition];
[self.view addGestureRecognizer:pan];
// 监听代理
pan.delegate = self;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer {
BOOL open = self.viewControllers.count > 1;
returnopen;
}
@end
这个方法中由于禁止了系统的手势,所以会导致系统表tableView的左滑删除变得不灵敏。
总结:其实解决自定义返回按钮,系统返回手势依然有效一句代码就够了 ,如果你的项目中有基类,写在基类里就可以了self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
希望对大家有所帮助