Tips7-iOS中隐藏StatusBar而不会改变导航栏高度的方法

在开发的过程中,可能会遇到隐藏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不是隐藏状态,整个导航栏的高度就不会改变。