1.bug 描述:通过 UINavigationController push 出一个新页面, 但是页面被 push 之后是透明的, 没有显示任何 UI, 就导致当前 Controller 上面有一个透明的层, 点击当前页面就没有任何反应, 但是通过 Xcode 自带的Debug view Hierarchy可以看到新页面已经push, 但是手机上并没有显示
可能是我叙述的不够清楚, 不是没有设背景色, 页面是是有 UI 的, 平时都没问题, push 之后 UI 就显示了, 然后拉接口刷新页面, 偶尔会出现这种情况, 点击 push 之后代码执行了, 页面也 push 了, 但是手机上没有显示, 只能用Debug view Hierarchy才能看到
2.触发 bug:只要在 rootview 右滑几次,点击 push 界面就会出现这个问题
3.解决方法是:
OC:
在 导航控制的根控制器(baseViewController) 中,实现代理:UIGestureRecognizerDelegate
在 viewdidload 方法中写:
self.navigationController.interactivePopGestureRecognizer.delegate = self;
然后实现下面的方法:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer {
if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]
&& gestureRecognizer ==self.navigationController.interactivePopGestureRecognizer
&&self.navigationController.visibleViewController == [self.navigationController.viewControllers objectAtIndex:0]) {
NSLog(@"Gesture blocked===手势锁定");
returnNO;
}
NSLog(@"Gesture begin===手势开启");
return YES;
}
swift:同理
在 viewdidload:
navigationController?.interactivePopGestureRecognizer?.delegate = self
实现下面的方法:
//解决执行了 push 之后,push 不出界面的 bug,要在 rootview 中实现这个方法
func gestureRecognizerShouldBegin(_ gestureRecognizer:UIGestureRecognizer) ->Bool{
// navigationController?.responds(to: #selector(interactivePopGestureRecognizer)) &&
if (gestureRecognizer == self.navigationController?.interactivePopGestureRecognizer) && (self.navigationController?.visibleViewController == self.navigationController?.viewControllers.first) {
return false
}
return true
}