美文网首页ios实用开发技巧iOS开发
iOS7 NavigationController 自定义返回按

iOS7 NavigationController 自定义返回按

作者: Page_online | 来源:发表于2016-08-31 10:37 被阅读2151次

    在iOS7中,如果使用了UINavigationController,那么系统自带的附加了一个从屏幕左边缘开始滑动可以实现pop的手势。但是,如果自定义了navigationItem的leftBarButtonItem,那么这个手势就会失效。解决方法有很多种

    第一种方法:不推荐使用,在特殊界面(如多级跳转)可以使用

    1.重新设置手势的delegate

    self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
    

    2.当然你也可以自己响应这个手势的事件

    [self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(handleGesture:)];
    

    我使用了第一种方案,继承UINavigationController写了一个子类,直接设置delegate到self。最初的版本我是让这个gesture始终可以begin

    -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
        return YES;
    }
    

    但是出现很多问题,比如说在rootViewController的时候这个手势也可以响应,导致整个程序页面不响应;如果在push的同时我触发这个手势,那么会导致navigationBar错乱,甚至crash;push了多层后,快速的触发两次手势,也会错乱。尝试了种种方案后我的解决方案是加个判断,代码如下,这次运行良好了。

    第二种方法:推荐使用,在NavigationController基类中执行

    @interface NavRootViewController : UINavigationController
    
    @property(nonatomic,weak) UIViewController* currentShowVC;
    
    @end
    
    @implementation NavRootViewController
    
    -(id)initWithRootViewController:(UIViewController *)rootViewController {
        NavRootViewController *nvc= [super initWithRootViewController:rootViewController];
        self.interactivePopGestureRecognizer.delegate = self;
        nvc.delegate = self;
        return nvc;
    }
    -(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    
    }
    -(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    
        if (navigationController.viewControllers.count == 1)
            self.currentShowVC = nil;
        else {
            self.currentShowVC = viewController;
        }
    }
    
    -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    
        if (gestureRecognizer == self.interactivePopGestureRecognizer) {
            return (self.currentShowVC == self.topViewController);
        }
        return YES;
    }
    @end

    相关文章

      网友评论

        本文标题:iOS7 NavigationController 自定义返回按

        本文链接:https://www.haomeiwen.com/subject/sjpqettx.html