美文网首页iOS CollectioniOS Developerios实用开发技巧
iOS 开发 完美解决navigationBar隐藏/显示

iOS 开发 完美解决navigationBar隐藏/显示

作者: 青春微凉来时路 | 来源:发表于2017-05-11 18:44 被阅读1562次

    欢迎加入 iOS开发QQ群:151133690

    项目开发navigationController的使用避免不了,随着界面的丰富我们会发现navigationBar的显示/隐藏变得极其恶心.

    从有bar -> 无bar,
    从有bar -> 有bar,
    从无bar -> 无bar,
    从无bar -> 有bar,
    

    总有那么一种情况的跳转显得十分不友好,网上找了很多资料,总于整理了一个相对简单的方式,让navigationBar完美的显示/隐藏.(此方法已经三个完整商业项目验证,如果您在使用中有任何疑问或问题,欢迎指正)

    先看效果图吧:

    从隐藏到隐藏
    (关于自定义NavigationBar隐藏后或者自定义侧滑返回失效的问题,如果你想知道解决方案可以与我联系,后期会单独写一篇相关文章...)
    从隐藏到显示 ]
    从显示到隐藏
    从显示到显示

    做法其实很简单,这里我使用的是分类的方法 给UIViewController 建一个分类 直接放代码.

    UIViewController+Hidden.h

    //
    //  UIViewController+Hidden.h
    //  demo
    //
    //  Created by 笨笨 on 2017/5/11.
    //  Copyright © 2017年 benben. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    @interface UIViewController (Hidden)<UINavigationControllerDelegate>
    
    @end
    
    

    UIViewController+Hidden.m

    //
    //  UIViewController+Hidden.m
    //  demo
    //
    //  Created by 笨笨 on 2017/5/11.
    //  Copyright © 2017年 benben. All rights reserved.
    //
    
    #import "UIViewController+Hidden.h"
    
    @implementation UIViewController (Hidden)
    
    - (void)navigationController:(UINavigationController*)navigationController willShowViewController:(UIViewController*)viewController animated:(BOOL)animated {
        
        if(viewController == self){
            [navigationController setNavigationBarHidden:YES animated:YES];
        }else{
            
            //系统相册继承自 UINavigationController 这个不能隐藏 所有就直接return
            if ([navigationController isKindOfClass:[UIImagePickerController class]]) {
                return;
            }
            
            //不在本页时,显示真正的navbar
            [navigationController setNavigationBarHidden:NO animated:YES];
            //当不显示本页时,要么就push到下一页,要么就被pop了,那么就将delegate设置为nil,防止出现BAD ACCESS
            //之前将这段代码放在viewDidDisappear和dealloc中,这两种情况可能已经被pop了,self.navigationController为nil,这里采用手动持有navigationController的引用来解决
            if(navigationController.delegate == self){
                //如果delegate是自己才设置为nil,因为viewWillAppear调用的比此方法较早,其他controller如果设置了delegate就可能会被误伤
                navigationController.delegate = nil;
            }
        }
    }
    
    
    @end
    
    

    用法就更简单了,只需将上面的分类文件拖到项目里,全局导入头文件,在需要隐藏navigationBar的UIViewController里这样写:(不需要隐藏的就不用管)

    /注意是 viewWillAppear 方法
    -(void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        
      //设置代理即可
        self.navigationController.delegate = self;
    }
    

    ----如果你的项目中所有的ViewController都有一个统一的基类 (比如都继承自BBViewController),只需把扩展类中的代码写到自定义基类里就行了.

    相关文章

      网友评论

      • Forin_:有tabbar的该怎么调用?不生效是什么原因呢?
      • Augustinus:你还有个群 哈哈哈:flushed:

      本文标题:iOS 开发 完美解决navigationBar隐藏/显示

      本文链接:https://www.haomeiwen.com/subject/vbxatxtx.html