有时候我们会遇到需要隐藏导航栏的需求.
我们一般的解决办法是在viewWillAppear中隐藏导航栏,在viewWillDisappear显示导航栏,这样来达到隐藏导航栏的效果。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.navigationController.navigationBarHidden = YES;
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.navigationController.navigationBarHidden = NO;
}
但是当从这个界面push到下一个界面的时候,有时候会碰到导航栏有半透明灰色的现象。如下图:
image.png
正常的效果:
image.png
大家可以看到明显的区别。(苹果自带导航栏默认颜色为(248,248,248))
用Capture View Hierarchy查看,发觉有一层黑色的_UIVisualEffectBackdropView;如下:
image.png
遇到这种问题,我想到的有2中解决方案:
1)然后我第一个想到的是,修改其背景颜色:但是当我获取NavigationBar的subview时,发觉找不到对应的view.
for (UIView *subview in self.navigationController.navigationBar.subviews) {
NSLog(@"----subview = %@",subview);
}
结果依次为:_UIBarBackground、_UINavigationBarLargeTitleView、_UINavigationBarContentView、_UINavigationBarModernPromptView,如下图
image.png
既然找不到对应的view,那就只好在view的最顶部添加一层view挡住;
NSString *targetName = @"_UIBarBackground";
Class _UIBarBackgroundClass = NSClassFromString(targetName);
for (UIView *subview in self.navigationController.navigationBar.subviews) {
if ([subview isKindOfClass:_UIBarBackgroundClass.class]) {
UIView *overlay = [[UIView alloc] initWithFrame:subview.bounds];
overlay.backgroundColor = RGBCOLOR(248, 248, 248);
[subview insertSubview:overlay atIndex:0];
break;
}
}
在运行,发觉导航栏正常了。
(但是想想感觉不对啊)
我用Capture View Hierarchy查看层级关系,发现_UIVisualEffectBackdropView在添加的overlayview的上面,理论上,黑色应该还在的,但是莫名其妙变成白色了,现在一直没想清楚,如果哪位大佬明白,麻烦留言下。
image.png image.png
2)第二种想到的能解决的方法是直接设置navigationBar.translucent = NO。
self.navigationController.navigationBar.translucent = NO;
但是这样设置会导致所有VC下移,下移高度为导航栏的高度。如下图:
image.png
这时候需要重新设置所有VC中的tableview的frame:
//原来
initWithFrame:CGRectMake(0, Height_NavBarAndStatusBar, MAINSCREEN_WIDTH, MAINSCREEN_HEIGHT - Height_NavBarAndStatusBar)
//现在修改为
initWithFrame:CGRectMake(0, 0, MAINSCREEN_WIDTH, MAINSCREEN_HEIGHT - Height_NavBarAndStatusBar)
网友评论