实际iOS编程中遇到的自定义导航栏按钮,导致手势返回失效的解决方法

实际iOS编程中遇到的自定义导航栏按钮,导致手势返回失效的解决方法

1在实际编程过程中往往需要自定义导航栏上面的按钮,也就用:

- (instancetype)initWithCustomView:(UIView *)customView;

但用了这个方法后可能会导致iOS7,8的手势返回失效,解决方法就是在自定义的导航栏的viewDidLoad方法中添加如下代码

注意:只有用系统的导航栏,或者继承于系统的导航栏才可以用Push方法,并且自带返回手势.

- (void)viewDidLoad
{
    [super viewDidLoad];
    __weak typeof (self) weakSelf = self;
    //解决因为自定义导航栏按钮,滑动返回失效的问题
    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.interactivePopGestureRecognizer.delegate = weakSelf;
    }
    
}

加了上面这一串代码后,再运行,返回手势就可以正常使用了.

2另外再教大家一个实用的方法,当Push的多个界面的导航栏返回按钮相同时,可以在自定义的UINavigationController中重写Push的方法,拦截Push操作,

并同时设置push后的TabBar隐藏(如果有需要的话),代码如下:

/**
 *  重写这个方法目的:能够拦截所有push进来的控制器
 *
 *  @param viewController 即将push进来的控制器
 */
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
   

    if (self.viewControllers.count > 0) { // 这时push进来的控制器viewController,不是第一个子控制器(不是根控制器)
        /* 自动显示和隐藏tabbar */
        viewController.hidesBottomBarWhenPushed = YES;
        
        /* 设置导航栏上面的内容 */
        // 设置左边的返回按钮
        viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithTarget:self action:@selector(back) image:@"home_nav_bar_back_icon" highImage:@"home_nav_bar_back_icon"];
         }

    [super pushViewController:viewController animated:animated];
}

- (void)back
{
    // 因为self本来就是一个导航控制器,self.navigationController这里是nil的
    [self popViewControllerAnimated:YES];
}