iOS13:使用UINavigationBarAppearance时忽略NavigationBar BarStyle

iOS 13: NavigationBar BarStyle is ignored when using UINavigationBarAppearance

我有一个自定义颜色的导航栏,我需要确保将状态栏颜色设置为白色。在 iOS 13 之前,这很容易做到,这是来自 UIViewController 的代码片段,它很好地完成了这项工作:

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.navigationBar.barStyle = .black
}

我在 iOS13 中面临的问题是,我现在需要使用 NavigationBar 的 standardAppearance 和 scrollEdgeAppearance 来取消新 UIKit 中的强制背景透明度。虽然我能够使用 UINavigationBarAppearance() 将 NavigationBar 的文本和背景颜色设置为我需要的颜色,但它会将我的状态栏颜色恢复为黑色。这是一个重现问题的简单示例:

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.navigationBar.standardAppearance = UINavigationBarAppearance() // <--- This is the line that reverts my status bar colour back to black
    self.navigationController?.navigationBar.barStyle = .black
}

我不确定这是我做错了什么还是 UIKit 错误?

编辑

通过将以下两个属性添加到我的 Info.plist 文件中,终于设法解决了这个问题:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

我很难学到它,但是,

"It isn't enough to just create an instance of UINavigationBarAppearance. "您必须在 UINavigationBar 实例上实际设置它。

这实际上不是我说的,我是在堆栈溢出的线程上找到的,我找过它,但找不到。但是,在上下文中应该对您有帮助的内容如下。

 //Using this we have to first set up the appearance.

 UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
 appearance.titleTextAttributes = @{NSFontAttributeName: font};

 //Then u have to use it on the navigation bar and if needed on scroll Edge 

  yourNavigationBar.standardAppearance = appearance;
  yourNavigationBar.scrollEdgeAppearance = appearance; 

 if you want this globally in your navigation bars 

 UINavigationBar.appearance.standardAppearance = appearance;

另一个 'hack ' 是将其添加到 Appdelegate 中,这将适用于您应用中的所有导航栏。

Appdelgate

func configureGlobalUI() {

UINavigationBar.appearance().barTintColor = .red
}

didFinishLaunching

中调用

我终于设法将整个应用程序的状态栏样式设置为白色。 SO 上有很多解决方案,但根据我的经验,其中一些可能非常 iOS 具体,即对 iOS 8-12 的某人有用的东西不一定意味着它会在 [=18] =]iOS 13 与 Xcode 11.

这是我的解决方案,适用于 iOS 13Xcode 11(也在设备上测试过运行 iOS 12 用于向后兼容)和 UINavigationBar.appearance().standardAppearance = UINavigationBarAppearance()。在 Info.plist 文件中添加以下两个属性:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

深色模式的更改包括名为 overrideUserInterfaceStyle 的新 UIViewUIViewController 属性。这是指示您想要特定 light/dark 样式而不是我们响应当前黑暗模式状态的默认行为的首选方式。

如果您在导航栏或导航控制器上设置此项,那么您应该会得到预期的行为(假设您希望到处都是亮或暗)。如果您需要更多控制,那么将 UINavigationController 子类化以更改其行为可能更有意义(例如,通过覆盖 childViewControllerForStatusBarStyle 并返回顶视图控制器)。