zoukankan      html  css  js  c++  java
  • iOS 7.0自定义导航栏后返回按钮失效

     iOS 7.0自定义导航栏后返回按钮失效(leftBarButtonItem使用后

    两种解决办法

    第一种(比较简单但有缺陷,缺陷稍后再说)

    1、自定义导航栏遵守UINavigationBarDelegate协议
    2、实现UINavigationBarDelegate的两个方法

    自己最好建一个UINavigationController子类(我这里是CihonNavViewController)代码如下:

    - (void)viewDidLoad {
        [super viewDidLoad];
        __weak CihonNavViewController *weakSelf = self;
        
        if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
        {
            self.interactivePopGestureRecognizer.delegate = weakSelf;
        }

        // Do any additional setup after loading the view.
    }
    - (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;
    }
    - (void)navigationBar:(UINavigationBar *)navigationBar didPopItem:(UINavigationItem *)item {
        //只有一个控制器的时候禁止手势,防止卡死现象
        if (self.childViewControllers.count == 1) {
            if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
                self.interactivePopGestureRecognizer.enabled = NO;
            }
        }
    }

    OK搞定,现在Run一下,发现问题已经解决了,他妈的但是来了。发现只有滑返回手势只能靠近屏幕左边缘才能使用

     接下来说第二种解决办法

    setp1:需要获取系统自带滑动手势的target对象
    id target = self.navigationController.interactivePopGestureRecognizer.delegate;


    setp2:创建全屏滑动手势~调用系统自带滑动手势的target的action方法
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];


    step3:设置手势代理~拦截手势触发
    pan.delegate = self;


    step4:别忘了~给导航控制器的view添加全屏滑动手势
    [self.view addGestureRecognizer:pan];


    step5:将系统自带的滑动手势禁用
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;


    steo6:还记得刚刚设置的代理吗?下面方法什么时候调用?在每次触发手势之前都会询问下代理,是否触发。
    这个方法就是拦截手势触发的方法.
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{}
    return NO;则不需要触发滑动手势
    return YES;则需要触发滑动手势


    方法二参考文章如下

  • 相关阅读:
    OpenGL_ES-纹理
    GCD 初步学习
    关于心理的二十五种倾向(查理·芒格)-3
    黑马day18 jquery高级特性&Ajax的load方法
    九度 1138
    FusionCharts简单教程---建立第一个FusionCharts图形
    【转】第二课.配置和初始化
    【转】Git详解之一:Git起步
    【转】1.5 起步
    【转】Cygwin的包管理器:apt-cyg
  • 原文地址:https://www.cnblogs.com/yangxiaolong/p/5952641.html
Copyright © 2011-2022 走看看