1.plist 文件添加
Status bar is initially hidden 设置其值为NO
View controller-based status bar appearance 设置其值为YES
View controller-based status bar appearance设置为NO表示statusBar的样式是全局控制的,在任意一个地方改变都会影响所有页面的显示效果一般在iOS 9以前配合UIApplication.shared.statusBarStyle = .default使用时会这样设置。然后preferredStatusBarStyle是ViewController的一个只读属性,这当然不可能全局控制statusBar的样式,所以View controller-based status bar appearance必须设置YES,preferredStatusBarStyle才会执行
2.被UINavigationController拦截
因存在导航控制器时,状态栏的更改是由UINavigationController控制的,要下更改就需要在当前类的导航控制器里增加如下方法去让系统获取他的顶层preferredStatusBarStyle/prefersStatusBarHidden值
override var prefersStatusBarHidden: Bool{
return topViewController?.prefersStatusBarHidden ?? false
}
override var childForStatusBarStyle: UIViewController? {
return topViewController
}
3.设置隐藏或状态栏颜色
在BaseController 增加属性 isHiddenStatesBar、statusBarStyleLight,在需要改变状态栏颜色及隐藏的页面重新set值后执行setNeedsStatusBarAppearanceUpdate()方法
override var prefersStatusBarHidden: Bool{
return isHiddenStatesBar
}
override var preferredStatusBarStyle: UIStatusBarStyle{
if statusBarStyleLight {
return .lightContent
} else {
if #available(iOS 13.0, *){
return .darkContent
}
return .default
}
}
4.隐藏启动页状态栏其它页面显示
plist文件中设置
Status bar is initially hidden 设置其值为YES
//然后在baseController里执行
override var prefersStatusBarHidden: Bool{
return false
}
备注:若发现setNeedsStatusBarAppearanceUpdate方法不执行可检查info.plist文件中View controller-based status bar appearance是否设置为YES