最近改一个项目
里面用到了侧滑返回·部分页面隐藏导航栏
改的过程中发现 上一波人两种效果都没搞好
所以现在我的任务就是把它搞好,可是实际的时候页面切换出现了假死问题
上一个项目是一样的套路,为什么这个项目就出错了呢,搞了我两天后不得不坐下来像个程序员一样一步一步检查代码了
- 1 遇到的问题->
触发手势返回之后 下一次跳转会进入假死状态
- 2 可能的原因->
interactivePopGestureRecognizer失效 · 线程切换问题
1 interactivePopGestureRecognizer的检查
所以先从interactivePopGestureRecognizer设置开始检查
这里也没什么说的,直接之前的代码copy过来
// 这些代码放到继承的UINavigationController里面即可
- (void)viewDidLoad {
[super viewDidLoad];
[self updatePopGestureDelegate];
}
- (void)updatePopGestureDelegate {
/*
默认全局开启侧滑返回
在BaseViewController里面每一个viewDidLoad里面设置
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
特殊情况下
在viewDidAppear里面设置self.navigationController.interactivePopGestureRecognizer.enabled = NO
在viewDidDisappear里面设置self.navigationController.interactivePopGestureRecognizer.enabled = YES
*/
__weak MHWNavigationController *weakSelf = self;
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.interactivePopGestureRecognizer.delegate = weakSelf;
self.delegate = weakSelf;
}
}
//侧滑代理
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer == self.interactivePopGestureRecognizer && self.viewControllers.count > 1) {
return YES;
}
return NO;
}
实际实际使用中加了这些就够了,但是在运行的时候发现还是不行
所以排除这一块的问题,转向检查线程切换的问题
2 线程切换的检查
因为这个项目里面又的页面隐藏了导航栏,有的页面没隐藏,这样来来去去的很乱,页面切换有的连动画都没有,体验起来就像是个三流app,所以我又加了一个新的BaseViewController并且在里面增加了动画设置
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
dispatch_async(dispatch_get_main_queue(), ^{
[self.navigationController setNavigationBarHidden:self.hideNavigationbarWhenViewWillAppear animated:YES];
});
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
if (self.hideNavigationbarWhenViewWillDisappear) {
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
}
就是这一句dispatch_async啊,就是这线程切换
系统的方法最好不要加线程切换,把这一句dispatch_async去掉
果然就OK了
[self.navigationController setNavigationBarHidden:YES animated:YES];
系统方法最好在默认线程环境执行
就像push pop操作一样在viewWillAppear里面失效一样,线程还是不能乱切
搞了我两天才想到有过这么一个方法设置
关联关键字interactivePopGestureRecognizer
·freeze
·push not work