最近在項目中遇到一個奇怪的問題,當導航控制器使用pushVIewController跳轉頁面是,偶爾會卡住頁面,
[self.navigationController pushViewController:vc animated:YES];
或者采用其他獲取導航控制器,比如
[self.tabBarController.selectedViewController.navigationController pushViewController:vc animated:YES];
造成卡頓問題一般有這么幾種情況:
1、子VC的背景色是透明的,這種很常見,給子VC的view加上背景色就OK
2、自定義導航控制器,在側滑返回后,經常會卡死,遇到這個情況不知道的會無從下手,這個原因是:
iOS7新增的一個特性,如果自定義了導航欄,那么側滑返回這個功能就會失效。雖然在自定義導航欄的viewDidLoad方法中添加self.interactivePopGestureRecognizer.delegate = (id)self;一行代碼就可以實現側滑,但是在根控制器上面進行側滑手勢的時候會出現卡死的現象,只要把根控制器的手勢給禁止掉就行了
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
self.interactivePopGestureRecognizer.enabled = self.viewControllers.count > 1 ? YES : NO;
}
或者在控制器即將push進來的時候判斷下,先禁止所有控制器的手勢,如果非根控制器允許手勢,自定義的leftBarButtonItem可以放在這個方法里面。
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item {
//只有一個控制器的時候禁止手勢,防止卡死現象
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.interactivePopGestureRecognizer.enabled = NO;
}
if (self.childViewControllers.count > 1) {
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.interactivePopGestureRecognizer.enabled = YES;
}
}
return YES;
}
當控制器pop完成之后做一次判斷,根視圖禁止手勢
- (void)navigationBar:(UINavigationBar *)navigationBar didPopItem:(UINavigationItem *)item {
//只有一個控制器的時候禁止手勢,防止卡死現象
if (self.childViewControllers.count == 1) {
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.interactivePopGestureRecognizer.enabled = NO;
}
}
}
總體思路就是在自定義導航控制器的時候,把根視圖的手勢給禁止掉