[iOS]解决重写UINavigationController导
2019-03-13 本文已影响0人
雨影
iOS侧滑卡死现象原因分析
现象重现
interactivePopGestureRecognizer是在iOS7后为UINavigationController新增的一个手势属性,使原来的pop返回可以通过滑动手势实现,从而方便了有单手操作习惯的用户。但是有个问题,苹果一直没有解决(至少iOS10.1之前还没有解决,可能苹果并不认为这是个问题吧):如果我们自定义了UINavigationController的leftBarButtonItem(一般是返回按钮),则在UINavigationController的rootViewController上滑动返回时,会出现界面卡死的情况。
原因分析
原因其实很简单,在UINavigationController的rootViewController上滑动时也响应了滑动返回手势,但此时,我们自定义了Nav的返回按钮,系统便不知道怎么处理了,于是乎...(个人分析原因)
解决方法:
知道了原因,解决起来就很方便了。既然nav的rootViewController不知道如何响应滑动返回手势,那我们干脆把rootViewController的滑动返回手势屏蔽掉不就行了?如果我们想屏蔽掉Nav的rootViewController的滑动返回手势,那就需要我们自定义一个Nav,在Nav的手势代理方法gestureRecognizerShouldBegin中禁掉rootViewController的滑动返回手势。
主要代码如下:
@implementation MyNavigationController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
__weak typeof(self) weakself = self;
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.interactivePopGestureRecognizer.delegate = (id)weakself;
}
}
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer == self.interactivePopGestureRecognizer) {
// 屏蔽调用rootViewController的滑动返回手势
if (self.viewControllers.count < 2 || self.visibleViewController == [self.viewControllers objectAtIndex:0]) {
return NO;
}
}
return YES;
}
@end