对于状态栏的修改, 在iOS 9之后主要是控制器内重写下面三个属性:
// 修改状态栏的样式
// 两种: .lightContent(白色), .default(黑色)
override var preferredStatusBarStyle: UIStatusBarStyle
// 状态栏的隐藏与显示
override var prefersStatusBarHidden: Bool
// 状态栏的隐藏与显示动画方式
// 三种: .none, .fade, .slide
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation
例如:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override var prefersStatusBarHidden: Bool {
return false
}
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}
但是, 如果想在一个控制器内动态修改状态栏的状态, 例如: 在弹出某视图的时候隐藏状态栏, 视图消失后再显示出来; 或者在弹出某视图的时候样式为白色, 消失后恢复成黑色等. 这就需要我们在代码中动态修改上面重写的返回值.
最容易想到的做法是定义一个全局的属性, 来动态修改, 例如, 我们来动态的让状态栏消失/显示, 我设置了一个这样的属性, 默认是显示状态栏的 :
var isStatusBarHidden = false
然后重写属性:
override var prefersStatusBarHidden: Bool {
return self.isStatusBarHidden
}
接下来, 我们只需要在需要隐藏/显示状态栏的地方修改这个值即可;
self.isStatusBarHidden = true
但是, 好像没反应...
虽然, 我们修改了返回值的状态, 但是控制器并没有更新这个状态, 这需要我们告诉控制器, 需要刷新状态了, 这就用到了下面这个方法:
open func setNeedsStatusBarAppearanceUpdate()
只需要在修改属性的时候调用一下这个方法即可:
self.isStatusBarHidden = true
self.setNeedsStatusBarAppearanceUpdate()
这样就可以按照我们的需求来动态的修改其状态了.
But, 每次修改状态值, 必须要调一下那个方法, 每次都写好像有些繁琐, 对此,我们可以这样来定义这个属性值:
var isStatusBarHidden = false {
didSet{
self.setNeedsStatusBarAppearanceUpdate()
}
}
每次状态修改的时候, 就去调用一下这个方法, 这样我们在写代码的时候, 只需要关心状态值即可!