首先,我们看看不经过任何处理的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上。