如何更改状态栏颜色?

Posted

技术标签:

【中文标题】如何更改状态栏颜色?【英文标题】:How to change status bar color? 【发布时间】:2020-09-23 13:34:40 【问题描述】:

在我的应用程序中,我使用图像作为ViewController's 的背景。对于我设置的项目设置中的状态栏:Status Bar Style - Default。我没有为状态栏使用其他任何东西。

问题是当启用 ios 暗模式时,我的 status bar 会变白。我需要它保持黑色。如何解决?

我也不想关闭应用程序中支持的 iOS 暗/亮模式。所以Info.plist 中的Appearance Light 不太适合我。

【问题讨论】:

【参考方案1】:

将您的状态栏样式设置为深色内容:

然后添加您的 info.plist 查看基于控制器的状态栏外观并将其设置为 NO

更新

如果您只想在确定的控制器中添加深色内容,请在 viewWillAppear 中添加 setNeedsStatusBarAppearanceUpdate ,然后覆盖首选状态栏样式:

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()

override var preferredStatusBarStyle: UIStatusBarStyle 
    if #available(iOS 13.0, *) 
        return .darkContent
     else 
        return .default
    

从导航控制器开始:

在您的场景委托中声明您的第一个导航控制器:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
    
    guard let windowScene = (scene as? UIWindowScene) else  return 
    window = UIWindow(windowScene: windowScene)
    window?.makeKeyAndVisible()
    let controller = UINavigationController(rootViewController: FirstViewController())
    controller.navigationBar.barStyle = .black
    window?.rootViewController = controller

在 SecondViewController 中覆盖状态栏样式

override var preferredStatusBarStyle: UIStatusBarStyle 
    if #available(iOS 13.0, *) 
        return .darkContent
     else 
        return .default
    

【讨论】:

在某些控制器中我需要白色。因为如果我使用你的答案,我有这个 - ibb.co/Dfy3Cd0 我更新了我的答案......如果我的答案满足你的问题,请用正确的答案检查它并投票...... 你不需要这个 if 语句,但如果你想在 else 语句中添加 return .default 我需要它,因为应用程序支持 iOS 12。但是,如果我使用 iOS 13 支持并使用您的代码,状态栏颜色不会改变。我正在使用断点并检查未调用“preferredStatusBarStyle”。我不知道为什么... 谢谢,这解决了我的问题!【参考方案2】:

对于每个ViewController,您可以使用简单的覆盖方法设置状态栏颜色。

override var preferredStatusBarStyle: UIStatusBarStyle 
    if #available(iOS 13, *) 
        return .darkContent
     else 
        return .default
    

不要忘记在 Info.plist 中将 View controller-based status bar appearance 设置为 YES

【讨论】:

以上是关于如何更改状态栏颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 7 上更改状态栏背景颜色和文本颜色?

如何根据主题更改状态栏/导航栏颜色/亮度?

打开 MFSideMenu 时如何更改状态栏颜色

如何更改棒棒糖设备状态栏的颜色? [复制]

如何在iOS 7上更改状态栏背景颜色和文本颜色? Warif Akhand Rishi

如何更改状态栏颜色?