解决iOS半透明导航栏导致阴影问题
Bingo 2017-09-02 00:19:10
i
O
S
# 前言
记录一个刚开始做 iOS 开发就遇到的问题,当 App 使用 UITabBarController
--> UINavigationController
--> UIViewController
这样的结构时,控制器做 push
或者 pop
操作时,都会因为导航栏的半透明出现不太和谐的阴影问题。
# 记录
# 问题一
从 iOS7 开始,导航控制器 push 时,导航栏右上角会有一片黑色阴影的矩形区域,一闪而过。
# 解决
导航栏看到的黑色阴影其实就是最底层窗口的颜色,window 默认的背景色是黑色。
方法一: 把导航栏设为不透明的
+ (void)initialize
{
UINavigationBar *bar = [UINavigationBar appearanceWhenContainedIn:self, nil];
bar.translucent = NO;
}
1
2
3
4
5
2
3
4
5
不推荐这么做。
- 如果把导航栏设为不透明的,UIScrollView、UITableView、UICollectionView 等可以滚动的控件,就失去了穿透导航栏的效果。
- 原本控件距顶部间距写了
64
,显示在屏幕顶部正常。当改为不透明后,就会多出高度为64
的间距。在项目的后期更不推荐去掉导航栏的半透明,否则就需要地毯式地搜索所有界面,把距离父控件顶部的64
改为0
。
方法二: 给 window 设置背景色
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
return YES;
}
1
2
3
4
5
6
2
3
4
5
6
# 问题二
尽管设了 window 的背景色,但是 pop 时,如果即将消失的控制器是有导航栏的,而下面那个控制器没有导航栏,就同样会出现阴影。阴影的颜色就是下面那个控制器导航栏位置的控件的背景色。
# 解决
设置导航条的背景颜色。
+ (void)initialize
{
UINavigationBar *bar = [UINavigationBar appearanceWhenContainedIn:self, nil];
[bar setBarTintColor:[UIColor whiteColor]];
}
1
2
3
4
5
2
3
4
5