解决iOS半透明导航栏导致阴影问题

前言

记录一个刚开始做 iOS 开发就遇到的问题,当 App 使用 UITabBarController –> UINavigationController –> UIViewController 这样的结构时,控制器做 push 或者 pop 操作时,都会因为导航栏的半透明出现不太和谐的阴影问题。

记录

问题一

从 iOS7 开始,导航控制器 push 时,导航栏右上角会有一片黑色阴影的矩形区域,一闪而过。

解决

导航栏看到的黑色阴影其实就是最底层窗口的颜色,window 默认的背景色是黑色。

方法一:
把导航栏设为不透明的

1
2
3
4
5
+ (void)initialize
{
UINavigationBar *bar = [UINavigationBar appearanceWhenContainedIn:self, nil];
bar.translucent = NO;
}

不推荐这么做。

  1. 如果把导航栏设为不透明的,UIScrollView、UITableView、UICollectionView 等可以滚动的控件,就失去了穿透导航栏的效果。
  2. 原本控件距顶部间距写了64,显示在屏幕顶部正常。当改为不透明后,就会多出高度为64的间距。在项目的后期更不推荐去掉导航栏的半透明,否则就需要地毯式地搜索所有界面,把距离父控件顶部的64改为0

方法二:
给 window 设置背景色

1
2
3
4
5
6
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
return YES;
}

问题二

尽管设了 window 的背景色,但是 pop 时,如果即将消失的控制器是有导航栏的,而下面那个控制器没有导航栏,就同样会出现阴影。阴影的颜色就是下面那个控制器导航栏位置的控件的背景色。

解决

设置导航条的背景颜色。

1
2
3
4
5
+ (void)initialize
{
UINavigationBar *bar = [UINavigationBar appearanceWhenContainedIn:self, nil];
[bar setBarTintColor:[UIColor whiteColor]];
}
  • 本文作者: Bingo
  • 本文链接: https://blog.bingo.ren/45.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!