状态栏外观无法正常运行-使用iOS 13黑暗模式

时间:2019-11-25 07:19:50

标签: swift statusbar ios-darkmode

我的应用程序具有登录前屏幕的default状态栏样式。 -登录后,应用在整个应用中的状态栏使用lightContent样式。

在iOS 12之前一切正常。开始在iOS 13 上创建问题(仅当启用了暗模式时)

有些东西我已经尝试过了,但仍然无法正常工作。

  • 我确实将UIUserInterfaceStyle设置为Light
  • 我确实将UIViewControllerBasedStatusBarAppearance设置为YES
  • 然后我在单独的视图控制器中尝试了以下代码

override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }

  • 还将此行添加到了类文件的viewDidLoad()中。

setNeedsStatusBarAppearanceUpdate()

但是,我仍然没有摆脱与状态栏相关的问题。在登录之前,我只需要状态栏在屏幕上变黑即可,一旦用户登录,状态栏应亮起。

对于黑暗和明亮模式,整个应用程序应具有相同的UI。 (适用于iOS 13以下的操作系统)目前可以正常运行,但只有状态栏会更改颜色。

注意:禁用暗模式时,一切工作正常。仅当启用黑暗模式时,这才会产生问题。

据我了解,我在Xcode中创建了一个新项目,并添加了3个具有不同状态栏外观的屏幕。

工作案例
VC1-Default样式
VC2-Default样式
VC3-LightContent样式

工作案例
VC1-LightContent样式
VC2-LightContent样式
VC3-Default样式

不起作用(失败)案例
VC1-Default样式
VC2-LightContent样式
VC3-Default样式

我想的是-如果您在应用程序中使用任何一种样式,则无论设备的暗模式还是亮模式,它都可以正常工作。但是,如果将DefaultLightContent都结合使用以在应用程序中显示状态栏,则在启用黑暗模式时,它无法按预期工作。

有人可以通过状态栏样式的这种行为帮助我吗?

这是我的三个视图控制器文件。它只是将一个控制器推到另一个。这是我上面提到的演示项目的文件。其中有失败案例。 view controllers

当黑暗模式关闭时:,即使我在VC2中覆盖状态栏样式,我也总是得到default状态栏样式。
黑暗模式关闭时:即使我在VC1和VC3中覆盖状态栏样式,我也总是得到lightContent状态栏样式。

这是我的info.plist文件 Info.plist file of my demo project

4 个答案:

答案 0 :(得分:4)

对于您来说,导航控制器负责维护状态栏样式。因此,您需要对导航控制器进行子类化,并覆盖它的preferredStatusBarStyle。

答案 1 :(得分:1)

您可以在项目设置的常规中设置默认状态栏样式。

答案 2 :(得分:0)

如果您不想在应用程序中支持暗模式(似乎想要固定的灯光和默认配色方案),则可以通过设置设置在Info.plist中完全退出使用它 .dockerignore可以变亮或变暗,也可以在每个单独的视图控制器上UIUserInterfaceStyle

编辑:

要只更改状态栏外观而不使用darkMode进行任何操作,您可以选择退出Info.plist中的黑暗模式,然后添加值为{YES的override var overrideUserInterfaceStyle: UIUserInterfaceStyle { get { .light } set { //you can leave this empty } },并且在每个viewController中您需要不同的状态栏样式,您需要覆盖首选样式状态栏外观属性如下:

UIUserInterfaceStyle

最后,您在viewDidLoad()中调用 override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent } }

Edit2:

如果在导航控制器中,则需要在自定义的navi控制器类中设置以上内容:

setNeedsStatusBarAppearanceUpdate()

然后在每个VC中,您都可以在viewDid上设置Appear属性:

import UIKit

class Navi: UINavigationController {

    public var requiredStatusBarStyle: UIStatusBarStyle = .lightContent {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
            requiredStatusBarStyle
    }

}

如果您不想在明暗之间剧烈跳动,可以将uiview动画包裹在setneedsstatusbarupdate上

 if let navi = navigationController as? Navi {
            navi.requiredStatusBarStyle = .darkContent
        }

答案 3 :(得分:0)

请尝试使用一次

controller.navigationController?.navigationBar.isTranslucent = false

因为在我看来,它是可行的。