iOS UINavigationController push時界面會卡住

最近在項目中遇到一個奇怪的問題,當導航控制器使用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;
        }
    }
}

總體思路就是在自定義導航控制器的時候,把根視圖的手勢給禁止掉

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容