全局
如果想改变所有控制器的状态栏样式,可以借助Info.plist实现
状态栏默认颜色是黑色文本
改变状态栏为白色:
打开Info.plist
添加View controller-based status bar appearance key,
UIViewControllerBasedStatusBarAppearance
) ,设置值为NO(false
).添加 Status bar style key (
UIStatusBarStyle
) 设置值为 Light Content (UIStatusBarStyleLightContent
).或通过代码UIApplication.shared.statusBarStyle = .lightContent
设置全局状态.
状态栏样式 | 值 | 状态栏文本颜色 |
---|---|---|
Default | UIStatusBarStyleDefault | 根据用户界面样式自动选择.当traitCollection.userInterfaceStyle=UIUserInterfaceStyle.light 时,为黑色文本,当traitCollection.userInterfaceStyle=UIUserInterfaceStyle.dark 时,为白色文本 |
Dark Content | UIStatusBarStyleDarkContent | 黑色文本,在浅色背景上使用 |
Light Content | UIStatusBarStyleLightContent | 白色文本,在深色背景上使用 |
这两个标志是iOS的旧属性,用例非常有限。
设置之后无法更改此操作,如果应用程序有某些视图控制器的状态栏样式不同,则可能需要考虑其他方法。
基于控制器的样式
默认情况下,状态栏样式依据控制器实例属性preferredStatusBarStyle
,只需要重写这个属性就可以修改当前控制器的状态栏样式
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
以上代码设置状态栏文本为白色.
如果状态栏没有依据指定的
preferredStatusBarStyle
值而改变,检查Info.plist的 View controller-based status bar appearance值,要确保其为YES.或者将这个key删除.默认值为YES.
根据条件改变状态栏样式
如果需要根据条件动态改变状态栏样式,比如,滚动scrollView,根据偏移量修改状态栏样式,仍然使用同样的preferredStatusBarStyle
来实现
由于其为只读属性,不能直接赋值,但是可以给通过一个变量和setNeedsStatusBarAppearanceUpdate()
方法来控制
var isDarkContentBackground = false // <1>
func statusBarEnterLightBackground() { // <2>
isDarkContentBackground = false
setNeedsStatusBarAppearanceUpdate()
}
func statusBarEnterDarkBackground() { // <3>
isDarkContentBackground = true
setNeedsStatusBarAppearanceUpdate() <4>
}
override var preferredStatusBarStyle: UIStatusBarStyle {
if isDarkContentBackground { // <5>
return .lightContent
} else {
return .darkContent
}
}
<1> 定义一个能白能量来表示当前的背景颜色
<2> 需要白色样式时,将isDarkContentBackground
设为false
<3>需要黑色样式时,将isDarkContentBackground
设为true
<4> 调用setNeedsStatusBarAppearanceUpdate()
通知系统preferredStatusBarStyle
改变了
<5> 根据 isDarkContentBackground
返回不同的样式
也可以在动画里调用setNeedsStatusBarAppearanceUpdate
方法,状态栏颜色就会有一个渐变的效果
func statusBarEnterLightBackground() { //
isDarkContentBackground = false
UIView.animate(withDuration: 0.3) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
func statusBarEnterDarkBackground() { //
isDarkContentBackground = true
UIView.animate(withDuration: 0.3) {
self.setNeedsStatusBarAppearanceUpdate()
}
}