1. 程式人生 > >iOS自定義導航欄,側滑返回卡死情況的解決辦法

iOS自定義導航欄,側滑返回卡死情況的解決辦法

側滑返回是iOS7新增的一個特性,如果自定義了導航欄,那麼側滑返回這個功能就會失效。雖然在自定義導航欄的viewDidLoad方法中新增self.interactivePopGestureRecognizer.delegate = (id)self;一行程式碼就可以實現側滑,但是在根控制器上面進行側滑手勢的時候會出現卡死的現象,只要把根控制器的手勢給禁止掉就行了。我的解決辦法如下:
1、自定義導航欄遵守UINavigationBarDelegate協議
2、實現UINavigationBarDelegate的兩個方法
- (BOOL)navigationBar:(UINavigationBar )navigationBar shouldPushItem:(UINavigationItem

)item;
- (void)navigationBar:(UINavigationBar )navigationBar didPopItem:(UINavigationItem )item;

在控制器即將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;
        }
    }
}