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

2018-05-28  本文已影响0人  kangyiii
首先,我们看看不经过任何处理的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上。

上一篇下一篇

猜你喜欢

热点阅读