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)題纫溃,蘋果一直沒(méi)有解決(至少iOS10.1之前還沒(méi)有解決墨林,可能蘋果并不認(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