zoukankan      html  css  js  c++  java
  • 去除导航栏的背景色和底部1像素黑色线条or隐藏导航栏

     一般项目我们都用创建一个公用的导航控制器,然后定义我们所需要的一些按钮啊 样式啊 等

    - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
    
        if (self.childViewControllers.count) {
    
           //这里可以自定义返回按钮
         
        }
    
        
        [super pushViewController:viewController animated:animated];
    }

    但是呢 ,我们有些控制器的的导航栏样式需要有所不一样,比如标题所提到的我们需要导航栏背景透明和去掉底部黑线

    解决方式为:在当前控制器

    - (void)viewWillAppear:(BOOL)animated添加两行代码

    [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setShadowImage:[UIImage new]];

    运行之后发现导航栏的背景和黑线确实没有了 (内容比较简单,就不上图了), 正在你准备欢呼的时候,确发现一点击返回或者push到下一个控制器的时候,连其他控制器的导航栏都透明了,所以,我们需要做的事情是,在要退出当前控制器的时候,需要重新设会默认的样式

    原先还在纳闷,我到底该怎么设回原来的值呢? 最后尝试了一下把image都设置为nil  就可以了 估计是系统内部自己会做判断,有传就显示  没传就用默认值

    解决方式为:在当前控制器

    - (void)viewWillDisappear:(BOOL)animated添加以下代码

    [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setShadowImage:nil];

    ,

    以上讲到到的方法会去掉背景色和黑线 ,如果只是单纯的要去掉黑线有种比较暴力的方法就是遍历导航栏,因为那条黑线其实是UIImageView,所以我们可以这么做:

    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        
        if ([self.navigationController.navigationBar respondsToSelector:@selector( setBackgroundImage:forBarMetrics:)])
        {
            
            NSArray *list=self.navigationController.navigationBar.subviews;
            
            for (id obj in list)
            {
                if ([UIDevice currentDevice].systemVersion.floatValue >= 10.0)
                {//10.0的系统字段不一样
                    UIView *view =   (UIView*)obj;
                    for (id obj2 in view.subviews) {
                        
                        if ([obj2 isKindOfClass:[UIImageView class]])
                        {
                            UIImageView *image =  (UIImageView*)obj2;
                            if (image.height <= 1) {
                                image.hidden = YES;
                            }
                            
                        }
                    }
                }
            }
        }
    }

    遍历会发现UIImageView有两个,所以我这里做判断,只要隐藏黑线.

    如果用的是公用的导航栏,当我们push到别的控制器或者进行pop的是时候,依然会影响到其他控制器的导航栏,如果不想影响到其他控制器,我们还是在

    - (void)viewWillDisappear:(BOOL)animated 方法里面在一次遍历,然后把hidden改为NO

    这里做下另一个需求的补充,假设我们需要隐藏整个导航栏,根究不同情况我们可以这么做:

    1,  设置隐藏和显示: 在需要隐藏导航栏的控制器里面添加如下代码, (该方法会导致返回手势不可用)

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        
        [self.navigationController setNavigationBarHidden:YES animated:YES];
    }
    
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        
        [self.navigationController setNavigationBarHidden:NO animated:YES];
        
    
    }

    2, 设置透明度: 在该控制器做如下设置, 这个方法会导致手势要返回上个控制器的时候会突然显示出导航栏,  也许我们需要实时监听手的触摸点与屏宽的比例来渐进的设置 navigationBar.alpha  数值

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        
        self.navigationController.navigationBar.alpha = 0;
    }
    
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        
         self.navigationController.navigationBar.alpha = 1.0;
    
    }

    end!

  • 相关阅读:
    nginx 与 lua 开发笔记
    使用openresty + lua 搭建api 网关(一)安装openresty ,并添加lua模块
    Java使用POI接口读写Excel文件方法
    React常用的库安装
    Android手机捉包
    ffmpeg压缩视频
    用 TypeScript 写 React & Redux
    yarn使用
    Angular 组件引入其他css不生效
    Webstrom技巧
  • 原文地址:https://www.cnblogs.com/yulongjiayuan/p/6694571.html
Copyright © 2011-2022 走看看