在iOS 9及其之前改变statusbar
的颜色比较简单,直接使用
UIApplication.shared.setStatusBarStyle(.default, animated: true)
或者UIApplication.shared.statusBarStyle = .default
即可.
在iOS 10开始 以上的方法被废弃。系统推荐preferredStatusBarStyle
进行替换。然而在项目实践中发现preferredStatusBarStyle
的get有时并不会执行。
1、被UINavigationController
拦截
当存在UINavigationController
时,statusBar
的状态由UINavigationController
的preferredStatusBarStyle
控制,所有不会执行rootVC的重写的preferredStatusBarStyle
。
这种情况下需要继承UINavigationController
并重写方法。
override var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
这个方法的目的就是让系统到其topViewController中去获取preferredStatusBarStyle的值。
2、Info.plist中View controller-based status bar appearance被设置为NO
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
才会执行。
setNeedsStatusBarAppearanceUpdate更新statusBar样式
setNeedsStatusBarAppearanceUpdate
,调用该方法preferredStatusBarStyle
会再次执行。
通常在同一个Viewcontroller
中statusBar
的样式时不会变的,所以preferredStatusBarStyle
只会执行一次。如果需要在viewController
显示出来后再次修改statusBar
的样式。需要在preferredStatusBarStyle
变化后调用setNeedsStatusBarAppearanceUpdate
方法。
var darkMode = false
override var preferredStatusBarStyle : UIStatusBarStyle {
return darkMode ? .default : .lightContent
}
网友评论