设置状态栏样式

全局

如果想改变所有控制器的状态栏样式,可以借助Info.plist实现

状态栏默认颜色是黑色文本

默认样式

改变状态栏为白色:

  1. 打开Info.plist

  2. 添加View controller-based status bar appearance key,UIViewControllerBasedStatusBarAppearance) ,设置值为NO(false).

  3. 添加 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.plistView 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()
    }
}
状态栏渐变

你可能感兴趣的:(设置状态栏样式)