手动将 NavigationBar 切换为深色模式

Manually switch NavigationBar to Dark Mode

在我的应用程序中,我有一个手动切换 light/dark 模式,我想要完成的是让导航栏具有 "dark mode" 外观(白色 text/icons 和黑色背景)在我需要在 light/dark 之间切换时触发。

我已经尝试了以下所有方法:

UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
UINavigationBar.appearance().tintColor=UIColor.white

self.navigationController?.navigationBar.barTintColor=UIColor.white
self.navigationController?.navigationBar.titleTextAttributes=[NSAttributedString.Key.foregroundColor:UIColor.white]

并且当输入上面我尝试过的任何代码时,导航栏永远不会改变。

完成此任务的正确方法是什么?

无法通过简单的一行将栏更改为您自己的本地黑暗模式。但是我们可以编写一个函数来执行类似于您想要的操作。请注意,做这种事情的正确方法是添加一个开关,使用特征集合在不同的全局视觉模式之间切换。

extension UIViewController {

    enum NavigationBarStyle {
        case dark, light
    }

    func setNavigationBar(style: NavigationBarStyle) {

        guard let bar = view.subviews.first(where: { return [=10=] is UINavigationBar }) as? UINavigationBar else { return }

        func set(item: UINavigationItem, color: UIColor) {
            item.rightBarButtonItem?.tintColor = color
            item.leftBarButtonItem?.tintColor = color
        }

        bar.barStyle = style == .dark ? .black : default

        let color: UIColor = style == .dark ? .white : .black
        for item in bar.items ?? [] {
            bar.titleTextAttributes = [.foregroundColor: color]
            set(item: item, color: color)
        }

    }

}

您需要确保已将导航栏添加到控制器的子视图。我以编程方式做了类似的事情,但我想使用界面构建器是一样的。

let navbar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: 375, height: 45))

navbar.backgroundColor = UIColor.white
navbar.delegate = self

let navItem = UINavigationItem()
navItem.title = "Title"
navItem.leftBarButtonItem = UIBarButtonItem(title: "Left", style: .plain, target: self, action: nil)
navItem.rightBarButtonItem = UIBarButtonItem(title: "Right", style: .plain, target: self, action: nil)

navbar.setItems([navItem], animated: true)

view.addSubview(navbar)

然后最后,在执行某些操作或您喜欢的任何操作后设置样式。使用;

setNavigationBar(style: .dark)

在用头撞墙一段时间后,我终于解决了这个问题(这可能与您遇到的问题不同,但希望这对某人有所帮助)。 我将导航栏色调颜色设置为“白色”。要使导航栏颜色在启用深色模式时自动更改,需要将其设置为“默认”。

这就是最终对我有用的东西:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

override func viewDidAppear(_ animated: Bool) {
    navigationController?.navigationBar.barStyle = .black
}