在开发的过程中,可能会遇到隐藏statusBar的需求。通常的做法就是在需要隐藏状态栏的ViewController中添加以下代码:1
2
3- (BOOL)prefersStatusBarHidden {
return YES;
}
我们打开App,美滋滋地看效果,咦?为什么导航栏少了20px?而且每次进入或离开这个Controller的时候,导航栏有明显的位移,这太影响观感了。设计妹子那肯定不能通过。那有没有其他方法设置状态栏的隐藏呢? 有!
For Example:
Objective-c 写法
可以在需要隐藏状态栏的ViewController的[viewWillAppear:]方法里添加代码1
[UIApplication sharedApplication].keyWindow.windowLevel = UIWindowLevelStatusBar + 1;
在[viewWillDisappear:]方法里添加:1
[UIApplication sharedApplication].keyWindow.windowLevel = UIWindowLevelNormal;
Swift 写法
1 | UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar + 1 |
1 | UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal |
运行App,打开该ViewController,可以发现状态栏被完美隐藏。
原因
为什么改变了keyWindow的windowLevel,就能隐藏状态栏呢?
因为statusBar也有自己的UIWindow,它的windowLevel就是UIWindowLevelStatusBar,高于UIWindowLevelNormal,所以会优先显示statusBar,当我们改变了keyWindow 的windowLevel之后,statusBar的显示优先级没有navigationBar的高了,而navigationBar又是不透明的,所以我们看不到它背后的statusBar,就达到了隐藏状态栏的效果。而只要statusBar不是隐藏状态,整个导航栏的高度就不会改变。