设置状态栏样式

447 阅读2分钟

设置状态栏样式

全局

如果想改变所有控制器的状态栏样式,可以借助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设置全局状态.

白色状态栏

状态栏样式状态栏文本颜色
DefaultUIStatusBarStyleDefault 根据用户界面样式自动选择.当traitCollection.userInterfaceStyle=UIUserInterfaceStyle.light时,为黑色文本,当traitCollection.userInterfaceStyle=UIUserInterfaceStyle.dark时,为白色文本
Dark Content UIStatusBarStyleDarkContent 黑色文本,在浅色背景上使用   
Light ContentUIStatusBarStyleLightContent白色文本,在深色背景上使用 

这两个标志是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 返回不同的样式

status-bar-no-animation

也可以在动画里调用setNeedsStatusBarAppearanceUpdate方法,状态栏颜色就会有一个渐变的效果


func statusBarEnterLightBackground() { // 

    isDarkContentBackground = false

    UIView.animate(withDuration: 0.3) {

        self.setNeedsStatusBarAppearanceUpdate()

    }

}

  


func statusBarEnterDarkBackground() { // 

    isDarkContentBackground = true

    UIView.animate(withDuration: 0.3) {

        self.setNeedsStatusBarAppearanceUpdate()

    }

}

状态栏渐变