iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案

本文介绍了在iOS7中使用leftBarButtonItem时遇到的滑动返回问题及其解决方案。通过调整导航控制器的设置,可以确保自定义返回按钮的同时保留系统的滑动返回功能。

在iOS7上使用leftBarButtonItem却无法响应滑动返回事件的问题,一番谷歌,最后终于解决了,在这里把解决方案分享给大家。

在iOS7之前的系统,如果要自定义返回按钮,直接设置backBarButtonItem是不行的,有两种方式,一种是用leftBarButtonItem替代;一种是:

?
1
2
3
UIImage *backButtonImage = [[UIImage imageNamed:@ "Graphics/Shared/navigation_back_button.png" ] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];  
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];  
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
但第二种方法只能自定义返回按钮的背景和文字,如果要自定义上面的图标则不行。所以使用leftBarButtonItem是最佳方式。

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

?
1
2
3
4
5
[_currentNav pushViewController:viewController animated:YES];  
//开启iOS7的滑动返回效果  
if ([_currentNav respondsToSelector:@selector(interactivePopGestureRecognizer)]) {  
     _currentNav.interactivePopGestureRecognizer.delegate = nil;  
}

这样即可完美解决iOS7上无法滑动的问题。

当然网上还有一种解决方法是在设置leftBarButtonItem之后加上:

?
1
2
self.navigationItem.backBarButtonItem = backButton;  
self.navigationController.interactivePopGestureRecognizer.delegate = self;

但这两行代码必须放在viewWillAppear中,相比上一种方式要修改的代码更多,因此建议使用上一种方式。

响应了iOS7的滑动返回手势之后,我们还会发现一个问题,iOS7的滑动返回不会调用我们给leftBarButtonItem设置的回调,那么返回的事件如何捕捉呢?可以通过以下代码:

?
1
2
3
4
5
6
7
8
9
- ( 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的滑动返回问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值