如何更改状态栏样式 - iOS 12

How to change status bar style - iOS 12

我需要根据背景颜色更新每个视图控制器的状态栏样式(UINavigationController 自动执行的操作)。

已经尝试了 Whosebug 上描述的所有选项(info.plist 中的 View controller-based status bar appearance 设置为 YES),但 none 对我有用。

我正在使用 Xcode 10 beta 6 和 Swift 4.2,目标是 iOS 12.

info.plist 中将 View controller-based status bar appearance 设置为 NO 并在每个视图控制器中覆盖 preferredStatusBarStyle ,如下所示:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

然后在您的视图控制器中调用 setNeedsStatusBarAppearanceUpdate()(例如在 viewDidLoad() 中)。

Swift 4+, iOS 12+

View controller-based status bar appearance 现在需要在 info.plist 中设置为 YES 因为 UIKit 不再希望我们通过 UIApplication.shared 编辑状态栏样式——状态栏样式现在是基于视图控制器。

然后,如果您希望在应用程序级别应用更改,只需在适当的容器视图控制器(最好是根视图控制器)中覆盖 preferredStatusBarStyle...

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

...这将传播到它下面的所有视图控制器。如果您想为每个视图控制器编辑状态栏样式,请为每个视图控制器应用此覆盖。

如果状态栏样式在运行时发生变化,那么您需要调用 setNeedsStatusBarAppearanceUpdate()(从 container/root 视图控制器或该特定视图控制器中的任何位置),否则不需要。

如果您将 info.plist 中的 View controller-based status bar appearance 设置为 YES 并且您的视图控制器嵌入到 UINavigationController 中,那么您的导航控制器将负责更新栏样式(通过navigationController.navigationBar.barStyle)并且preferredStatusBarStyle 属性将被忽略

我有 Xcode 10.2,发现在 info.plist 中将基于视图控制器的状态栏外观设置为 "YES" 根本不会改变状态栏样式。

但是,我确实发现更改 info.plist 文件中的两个键将完成将状态栏更改为浅色或深色的所有工作,而无需任何额外编码。

这是我自己修复它的方法
将鼠标悬停在 info.plist 文件的第一行 "Information Property List" 上时,会出现一个小的圆形“+”按钮。单击此按钮并滚动项目,直到找到以下键。

查看基于控制器的状态栏外观 [将此值设置为] NO
状态栏样式 [将此值设置为] UIStatusBarStyleLightContent

注意:在值列表中找不到 UIStatusBarStyleLightContent 作为可选项目,必须在值框中键入。

我希望这对您或其他正在寻找此问题答案的人有所帮助。

如果你被包裹在导航控制器中,你将需要这个:

final class LightNavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}
override func viewDidLoad(){
    super.viewDidLoad()

    navigationController?.navigationBar.barStyle = .default
}

override var prefersStatusBarHidden: Bool {
    return true
}

我也在同一屏幕上应用了滚动视图,通过这段代码能够解决状态栏问题。