zoukankan      html  css  js  c++  java
  • iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案

    今天遇到了在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];  

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


    如果大家觉得对自己有帮助的话,还希望能帮顶一下,谢谢:)
    转载请注明出处,谢谢!
  • 相关阅读:
    cookie
    接上一篇
    es6
    本地文件r如何上传到github上
    npm的使用说明
    被公司996下的程序媛心路历程
    起点2020
    ES5(基本包装类型)字符串的方法
    ES5数组的方法
    css伪类
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879374.html
Copyright © 2011-2022 走看看