起初为了满足设计要求,自定义了导航栏的self.navigationItem.leftBarButtonItem
然后发现UINavigationController自带的侧滑返回消失了;
于是我以为这很简单,遵守UIGestureRecognizerDelegate协议,
然后:
self.navigationController.interactivePopGestureRecognizer.delegate=self;
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
这样解决了侧滑返回的问题,本以为问题就这样简单搞定了,没想到出了一个让我头疼好几天才找出原因的bug,简直就是自己给自己挖了一个大坑。
在rootViewController侧滑后,程序就开始出现莫名其妙的bug,点击按钮无法触发事件,或者反应很长时间,点一下,卡半天,最终卡死不动。
找过很多地方的问题,都不能解决这个问题。最终找到一个方法,自定义一个navigationController作为rootViewController。
代码如下:
需要遵守:UINavigationControllerDelegate,UIGestureRecognizerDelegate协议
- (void)viewDidLoad {
[superviewDidLoad];
self.delegate=self;
__weaktypeof(self)weakSelf =self;
if([selfrespondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.interactivePopGestureRecognizer.enabled=YES;
self.interactivePopGestureRecognizer.delegate= weakSelf;
}
}
在推出新视图之前停用手势。
-(void)pushViewController:(UIViewController*)viewController animated:(BOOL)animated{
if([selfrespondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.interactivePopGestureRecognizer.enabled=NO;
}
[superpushViewController:viewControlleranimated:animated];
}
新视图加载完成后启用手势
-(void)navigationController:(UINavigationController*)navigationController didShowViewController:(UIViewController*)viewController animated:(BOOL)animated{
if([navigationControllerrespondsToSelector:@selector(interactivePopGestureRecognizer)]) {
navigationController.interactivePopGestureRecognizer.enabled=YES;
}
一般根控制器都是禁止右滑返回的,所以设置第一个控制器停用手势。
if(navigationController.viewControllers.count==1) {
navigationController.interactivePopGestureRecognizer.enabled=NO;
navigationController.interactivePopGestureRecognizer.delegate=nil;
}
}
如果暂时理解不了的话,照搬就行,能解决问题,我也是打算把代码存在这里以后常翻一下。如果发现有不足的地方,请在评论里指正,谢谢~!