iOS开发--iOS7以上自定义leftBarButtonItem后系统滑动返回失效的完美解决方案

我们在开发过程中都会或多或少的遇到过自定义"返回"按钮后系统返回手势无法响应的情况,下面做一总结:

在iOS7系统中,自带了可以通过右滑返回上一级页面的手势,如果仅仅修改leftBarButtonItem是无法响应这个手势的。可以在pushViewController之后加入如下代码:

    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
    //在自定义leftBarButtonItem后添加下面代码就可以完美解决返回手势无效的情况
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.delegate = nil;
    }

可以通过下面方式进行返回的事件的捕捉:

- (void)viewWillDisappear: (BOOL)animated
{
    [super viewWillDisappear: animated];
    if (![[self.navigationController viewControllers] containsObject: self])
    {
        // the view has been removed from the navigation stack, back is probably the cause
        // this will be slow with a large stack however.
    }
}

至此,我们就完美解决了iOS7上使用leftBarButtonItem的滑动返回问题。

同时可以通过下面方式,来解决多次滑动之后会导致界面假死的情况:

在所有除一级页面之外的页面的viewDidAppear和viewWillDisappear中加入以下代码:

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    //代理置空,否则会闪退
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.delegate = nil;
    }
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    //开启iOS7的滑动返回效果
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        //只有在二级页面生效
        if ([self.navigationController.viewControllers count] == 2) {
            self.navigationController.interactivePopGestureRecognizer.delegate = self;
        }
    }
}


同时在UINavigationcontroller的delegate中实现以下方法:

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    //开启滑动手势
    if ([navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        navigationController.interactivePopGestureRecognizer.enabled = YES;
    }
}

在pushviewcontroller之前加入以下代码:

 if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.delegate = NO;
    }
    [self.navigationController pushViewController:viewController animated:YES];

即可在实现滑动返回的同时,避免界面卡死的问题。


同时我们在应用中还会遇到一种情况:
在一个界面中会使用UIScrollView. 在这时,会阻挡系统的向右返回手势,可以通过下面方式解决:
- (void)viewDidLoad {
    [super viewDidLoad];
    .....
    self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
实现代理方法:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    [otherGestureRecognizer requireGestureRecognizerToFail:gestureRecognizer];
    return NO;
}

当然不要忘记制空代理:<否则会崩溃>
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    //代理置空,否则会闪退
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.delegate = nil;
    }
}

参考: 
1: http://blog.csdn.net/zhaoxy_thu/article/details/15811189
2: http://ju.outofmemory.cn/entry/103566

转载请标注出处. 尊重原创.
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值