去除导航栏的背景色和底部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!

原文地址:https://www.cnblogs.com/yulongjiayuan/p/6694571.html