导航栏(Nav) 全透明效果的一种另类实现

首先,我们看看不经过任何处理的Nav层级结构:
Nav层级结构

其中需要注意是:UIImageView是导航栏下面的那条线。有时候我们会发现Nav有一层蒙版,其实都是UIVisualEffectView在作怪。

主流实现方案

给nav设置一张空图片便可达到导航栏全透明效果。

//设置导航栏背景图片为一个空的image,这样就透明了 
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; 
//去掉透明后导航栏下边的黑边 
[self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];

层级结构:


层级结构

我们可以看出,在设置了空图片之后,UIVisualEffectView没有加入进来,取而代之的是我们设置的空图片

另类实现方案

直接将UIVisualEffectView隐藏,让蒙版消失。

[self.navigationController.navigationBar.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if([obj isMemberOfClass:NSClassFromString(@"_UIBarBackground")]){
            [obj.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                if([obj isMemberOfClass:NSClassFromString(@"UIVisualEffectView")]||[obj isMemberOfClass:NSClassFromString(@"UIImageView")]){
                    obj.hidden = YES;
                }
            }];
        }
    }];

层级结构:


层级结构

值得注意的是:如果直接将UIVisualEffectView隐藏虽能达到全透明效果,但随之而来的负面影响是 在设置barTintColor会失效,因为barTintColor添加的图层也是在UIVisualEffectView上。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 在开发过程中,经常会碰到控制器对应的导航栏的背景颜色不一致或者需要让导航栏背景透明的需求。在导航控制器pus...
    渐z阅读 2,909评论 0 8
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,301评论 4 61
  • 引 如我在传送门:iOS导航栏切换界面时隐藏和显示[https://www.jianshu.com/p/03170...
    Cloudox_阅读 11,574评论 14 62
  • 我恳求你 给我一滴水 湿润我干涸了多年的 眼眶 你不肯 你说 你要将它留给 心爱的人
    余同阅读 201评论 0 5
  • 11.9日 周四 晴 庆庆妈妈第72篇 今天女儿做完老师布置的作业,又做了一份我给她买的数学试卷,今天的写的...
    史响庆阅读 165评论 1 0