iOS側(cè)滑卡死現(xiàn)象原因分析
現(xiàn)象重現(xiàn)
interactivePopGestureRecognizer是在iOS7后為UINavigationController新增的一個(gè)手勢(shì)屬性奕枢,使原來(lái)的pop返回可以通過(guò)滑動(dòng)手勢(shì)實(shí)現(xiàn)虏辫,從而方便了有單手操作習(xí)慣的用戶慕嚷。但是有個(gè)問(wèn)題荣回,蘋(píng)果一直沒(méi)有解決(至少iOS10.1之前還沒(méi)有解決羹饰,可能蘋(píng)果并不認(rèn)為這是個(gè)問(wèn)題吧):如果我們自定義了UINavigationController的leftBarButtonItem(一般是返回按鈕),則在UINavigationController的rootViewController上滑動(dòng)返回時(shí)饭寺,會(huì)出現(xiàn)界面卡死的情況傅事。
原因分析
原因其實(shí)很簡(jiǎn)單,在UINavigationController的rootViewController上滑動(dòng)時(shí)也響應(yīng)了滑動(dòng)返回手勢(shì)宪郊,但此時(shí)掂恕,我們自定義了Nav的返回按鈕拖陆,系統(tǒng)便不知道怎么處理了,于是乎...(個(gè)人分析原因)
解決方法:
知道了原因竹海,解決起來(lái)就很方便了慕蔚。既然nav的rootViewController不知道如何響應(yīng)滑動(dòng)返回手勢(shì),那我們干脆把rootViewController的滑動(dòng)返回手勢(shì)屏蔽掉不就行了斋配?如果我們想屏蔽掉Nav的rootViewController的滑動(dòng)返回手勢(shì)孔飒,那就需要我們自定義一個(gè)Nav,在Nav的手勢(shì)代理方法gestureRecognizerShouldBegin中禁掉rootViewController的滑動(dòng)返回手勢(shì)艰争。
主要代碼如下:
@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) {
// 屏蔽調(diào)用rootViewController的滑動(dòng)返回手勢(shì)
if (self.viewControllers.count < 2 || self.visibleViewController == [self.viewControllers objectAtIndex:0]) {
return NO;
}
}
return YES;
}
@end