iOS:使用 UINavigationBarAppearance 时指定状态栏文本颜色,现在忽略 barstyle

ben*_*lis 13 uinavigationbar uikit ios uistatusbar swift

问题

我有一个应用程序,它针对不同的流程具有不同颜色的导航栏。某些导航栏具有浅色背景,并且需要黑色状态栏文本。其他人有一个较暗的导航栏,并需要白色的状态栏文本。

作为迁移到 iOS15 的一部分,我更新了一个正在开发的应用程序,以使用UINavigationBarAppearance导航栏样式的方法。除了状态栏颜色之外,我可以像以前一样设置所有内容的样式。

以前我一直使用barStyle导航栏上的属性来设置状态栏文本颜色。

navigationBar.barStyle = .black
Run Code Online (Sandbox Code Playgroud)

使用时这似乎不起作用 UINavigationBarAppearance

示例代码

旧的造型方法

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let navigationBar = navigationController?.navigationBar
        
        // Style using old approach
        navigationBar?.barTintColor = UIColor.purple
        navigationBar?.titleTextAttributes = [.foregroundColor: UIColor.white]
        
        // Use barStyle to set status bar text color to white
        // This only work when using the old styling approach
        navigationBar?.barStyle = .black
    }
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

新的造型方法

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let navigationBar = navigationController?.navigationBar
        
        // Style nav bar using new Appearance API
        let navBarAppearance = UINavigationBarAppearance()
        navBarAppearance.backgroundColor = UIColor.purple
        navBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.white]

        navigationBar?.standardAppearance = navBarAppearance
        navigationBar?.scrollEdgeAppearance = navBarAppearance
        
        // Use barStyle to set status bar text color to white
        // This only work when using the old styling approach
        navigationBar?.barStyle = .black
    }
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

备择方案

强制导航栏上的深色/浅色模式

可以使用 属性将状态栏文本设置为白色overrideUserInterfaceStyle。要将状态栏文本设置为白色,请设置

navigationBar.overrideUserInterfaceStyle = dark
Run Code Online (Sandbox Code Playgroud)

然而,这也会导致在黑暗模式下导航栏中的按钮出现菜单,这不是我想要的。

在此输入图像描述

子类 UINavigationController

我想我也可以子类 UINavigationController 并显式覆盖preferredStatusBarStyle以强制黑色或白色文本。

在我们创建新的导航控制器的任何地方都必须使用子类来指定状态栏文本颜色似乎有点极端。

还要别的吗?

我不确定是否有更好的方法?

小智 3

我将 barStyle 和 overrideUserInterfaceStyle 与 UINavigationBarAppearance 一起使用

// statusBarStyle is .black or .default
if case .black = statusBarStyle {
     navigationController?.navigationBar.overrideUserInterfaceStyle = .dark
} else {
    navigationController?.navigationBar.overrideUserInterfaceStyle = .light
}
navigationController?.navigationBar.barStyle = statusBarStyle
Run Code Online (Sandbox Code Playgroud)

看看它怎么运作:

在此输入图像描述 在此输入图像描述