iOS导航栏全透明 遇到的UIBarBackground问题
https://www.jianshu.com/p/5d0ed9dae24d
需要在导航栏做高斯模糊效果,想把navigationBar设置透明,然后在navigationBar后面加个UIVisualEffectView,而不用改动title和左右button及其他VC里面的布局, 结果发现navigationBar总有一层白色的View, 看了下层级发现是个_UIBarBackground类的View,设置backgroundColor也不顶用. 于是将其取出来隐藏了.
整理了下要将导航栏设置透明的两种情况:
-
界面从(0,0)开始布局, [navigationBar setTranslucent:YES];
将navigationBar里的颜色及子view的颜色设置为透明即可,
1. setBackgroundColor:UIColor.clearColor
2. setBarTintColor:UIColor.clearColor
3. setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]
4. setShadowImage:[UIImage new] size:CGSizeMake(SCREEN_WIDTH, 0.01f)] -
界面从(0,44)开始布局 [navigationBar setTranslucent:NO];
只进行上述操作不够, 因为系统会加一个frame为(0,0,SCREEN_WIDTH,44)
的白色View作为遮挡, 而且在iOS 10版本与iOS 10之前的版本两种情况下,这个view的类还不一样.iOS 10 :_UIBarBackground
iOS 10之前: _UINavigationBarBackground
把这个类的view设置hidden即可实现从(0,44)开始布局且导航栏全透明.
代码:[self.navigationBar.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([obj isKindOfClass:NSClassFromString(@"_UIBarBackground")]||[obj isKindOfClass:NSClassFromString(@"_UINavigationBarBackground")]) { obj.hidden = YES; } }];