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

来源:互联网 发布:反美颜软件 编辑:程序博客网 时间:2024/05/17 11:07
今天遇到了在iOS7上使用leftBarButtonItem却无法响应滑动返回事件的问题,一番谷歌,最后终于解决了,在这里把解决方案分享给大家。

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

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. UIImage *backButtonImage = [[UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];  
  2. [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];  
  3. [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];  

但第二种方法只能自定义返回按钮的背景和文字,如果要自定义上面的图标则不行。所以使用leftBarButtonItem是最佳方式。

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

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. [_currentNav pushViewController:viewController animated:YES];  
  2. //开启iOS7的滑动返回效果  
  3. if ([_currentNav respondsToSelector:@selector(interactivePopGestureRecognizer)]) {  
  4.     _currentNav.interactivePopGestureRecognizer.delegate = nil;  
  5. }  

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

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

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. self.navigationItem.backBarButtonItem = backButton;  
  2. self.navigationController.interactivePopGestureRecognizer.delegate = self;  

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

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

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. - (void)viewWillDisappear: (BOOL)animated  
  2. {  
  3.     [super viewWillDisappear: animated];  
  4.     if (![[self.navigationController viewControllers] containsObject: self])  
  5.     {  
  6.         // the view has been removed from the navigation stack, back is probably the cause  
  7.         // this will be slow with a large stack however.  
  8.     }  
  9. }  

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

有朋友提出以上方式在多次滑动之后会导致界面假死,这里再给出一种解决方案:

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

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. - (void)viewWillDisappear:(BOOL)animated {  
  2.     [super viewWillDisappear:animated];  
  3.     //代理置空,否则会闪退  
  4.     if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {  
  5.         self.navigationController.interactivePopGestureRecognizer.delegate = nil;  
  6.     }  
  7. }  

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. - (void)viewDidAppear:(BOOL)animated {  
  2.     [super viewDidAppear:animated];  
  3.     //开启iOS7的滑动返回效果  
  4.     if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {  
  5.         //只有在二级页面生效  
  6.         if ([self.navigationController.viewControllers count] == 2) {  
  7.             self.navigationController.interactivePopGestureRecognizer.delegate = self;  
  8.         }  
  9.     }  
  10. }  

在uinavigationcontroller的delegate中实现以下方法:

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {  
  2.     //开启滑动手势  
  3.     if ([navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {  
  4.         navigationController.interactivePopGestureRecognizer.enabled = YES;  
  5.     }  
  6. }  

在pushviewcontroller之前加入以下代码:

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //在切换界面的过程中禁止滑动手势,避免界面卡死  
  2. if ([_currentNav respondsToSelector:@selector(interactivePopGestureRecognizer)]) {  
  3.    _currentNav.interactivePopGestureRecognizer.enabled = NO;  
  4. }  
  5. [_currentNav pushViewController:viewController animated:YES];  

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


如果大家觉得对自己有帮助的话,还希望能帮顶一下,谢谢:)
个人博客:http://blog.csdn.net/zhaoxy2850
本文地址:http://blog.csdn.net/zhaoxy_thu/article/details/15811189
转载请注明出处,谢谢!
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刚刚出生的宝宝拉肚子怎么办 刚出生的婴儿拉肚子怎么办 新生儿5天拉稀水怎么办 10个月孩子拉肚子怎么办 不满月的宝宝拉肚子怎么办 一周岁宝宝发烧腹泻呕吐怎么办 6个月宝宝37度怎么办 1岁宝宝发烧37.2怎么办 新生儿发烧37度3怎么办 两个月宝宝抵抗力差怎么办 6月宝宝着凉拉稀怎么办 六个月的宝宝拉肚子怎么办 衣服颜色太深了怎么办 一多半宝宝爱喝水不爱吃饭怎么办 十个月宝宝不爱吃饭怎么办 十个月宝宝突然不爱吃饭怎么办 二十个月宝宝不爱吃饭怎么办 十个月的宝宝不爱吃饭怎么办 6年级学生数学差怎么办 打印机打不出来就是一张白纸怎么办 wps表格下拉数字不递增怎么办 wps表格圈怎么打出来怎么办 手表固定圈掉了怎么办 起来觉得头晕头胀怎么办? 孩子不好好写作业怎么办 孩子考试考差了怎么办 孩子计算题马虎大意怎么办 二年级孩子不认字怎么办 发现计算上的错误怎么办 孩子不好好做作业怎么办 手破了红肿了怎么办呢 老师反应孩子在校粗心胆小怎么办 四年级的学生计算粗心怎么办 老打孩子骂孩子怎么办 站久了脚肿了怎么办 孩子初中了书写越来越潦草怎么办 给孩子自由孩子无法无天怎么办 孩子挑食幼儿园老师该怎么办 老师说孩子挑食家长怎么办 工作中老是粗心不细心怎么办 小孩数学总是特别粗心该怎么办