【问题标题】:iOS 13: NavigationBar BarStyle is ignored when using UINavigationBarAppearanceiOS 13:使用 UINavigationBarAppearance 时忽略 NavigationBarBarStyle
【发布时间】:2019-10-19 22:39:31
【问题描述】:

我有一个自定义颜色的导航栏,我需要确保状态栏颜色设置为白色。在 iOS 13 之前,这很容易做到,这里有一个 UIViewController 中的代码 sn-p 可以很好地完成这项工作:

override func viewDidLoad() {
    super.viewDidLoad()

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

我在 iOS 13 中面临的问题是我现在需要使用 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>

【问题讨论】:

标签: ios swift uikit uinavigationbar ios13


【解决方案1】:

暗模式的更改包括一个名为 overrideUserInterfaceStyle 的新 UIViewUIViewController 属性。这是表明您想要特定的明/暗样式而不是我们响应当前暗模式状态的默认行为的首选方式。

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

【讨论】:

  • 感谢大卫的回答。在我的特定情况下,我不需要根据视图控制器设置多种状态栏颜色,只需要为整个应用程序设置一种颜色(因此,必须更改每个视图控制器是一种矫枉过正的做法)。但我认为您的回答对那些需要此功能的人很有用。
  • 虽然看起来很奇怪,但我被告知当前允许导航栏影响状态栏样式的最佳做法是使用UIView.overrideUserInterfaceStyle 属性。
  • 这是正确答案。要将状态栏文本设置为白色,请将navBar.overrideUserInterfaceStyle = dark 设置为黑色状态栏文本,反之亦然。
  • 唯一的缺点是它在黑暗模式下也可以从导航栏中的按钮制作菜单
【解决方案2】:

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

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

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

【讨论】:

【解决方案3】:

我学得很辛苦,但是,

“仅仅创建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

【讨论】:

  • 嗨,我不确定这是否能回答我的问题。按照我的问题中的描述设置 UINavigationBarAppearance 没有问题,问题是它具有取消设置状态栏颜色(navigationBar.barStyle = .black)的副作用。当我不使用 UINavigationBarAppearance 时,状态栏颜色可以正常工作。
猜你喜欢
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-15
  • 2023-04-02
  • 2011-12-08
  • 1970-01-01
  • 2021-01-05
相关资源
最近更新 更多