【问题标题】:Dynamically Change iOS Nav Bar Color (Dark Mode)动态更改 iOS 导航栏颜色(深色模式)
【发布时间】:2020-01-21 00:28:45
【问题描述】:

我正在尝试在我的应用程序中实现暗模式切换 - 这将涉及当 UIViewController 已经在屏幕上可见时将导航栏颜色切换为黑色。我知道如何通过设置来做到这一点

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

但是,在 AppDelegate 中,这在这种情况下不起作用,因为它需要动态完成。

我也尝试过navigationController?.navigationBar.barTintColor = UIColor.white,但这也不起作用。

更新:

我认为很多回复都与这个问题的目的混淆了——这与刚刚发布的 iOS13 暗模式完全无关——这是我想添加到我的应用程序中的独立暗模式功能(类似于 Messenger 等在 iOS 13 发布之前在应用内提供暗模式的其他应用程序)。我需要做的是在 UINavigationBar 已经显示在屏幕上之后动态更新它的颜色,就像我可以通过 view.backgroundColor = .white 更改视图的背景颜色一样,这将实时更新颜色在屏幕上。

【问题讨论】:

标签: ios swift uiviewcontroller uinavigationcontroller uinavigationitem


【解决方案1】:

通过使导航栏半透明来实现这一点(AppDelegate):

let barAppearance = UINavigationBar.appearance()
barAppearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: appRed]
barAppearance.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
barAppearance.shadowImage = UIImage()
barAppearance.isTranslucent = true

接下来我创建一个视图并将其放置在导航栏后面,如下所示(使用 SnapKit):

let coverView = UIView() 
cover.snp.makeConstraints {
        make in
        make.left.right.top.equalTo(self)
        make.bottom.equalTo(self.snp.top).offset(universalNumber(num: parent!.topbarHeight))
}

parent 是我的UIViewControllertopBarHeight 是:

extension UIViewController {
/**
 *  Height of status bar + navigation bar (if navigation bar exist)
 */
    var topbarHeight: CGFloat {
        return UIApplication.shared.statusBarFrame.size.height +
            (self.navigationController?.navigationBar.frame.height ?? 0.0)
    }
}

最后,更新我设置的颜色

coverView.backgroundColor = universalWhite() 

在哪里

func universalWhite() -> UIColor {
   let defaults = UserDefaults.standard
   let darkMode = defaults.bool(forKey: "darkMode")
   if darkMode {
       return .black
   } else {
       return .white
    }
 }

【讨论】:

    【解决方案2】:

    您可能需要检查 UIViewController 提供的特征以确定当前界面样式,而不是手动检查运行 iOS 13+ 的版本。使用此方法,您可以在 Assets 文件夹中为两种外观定义颜色。

    对于 iOS 13 以下,您可以使用类似于 @byaruah 所说的内容,但这不是全局效果。您还应该考虑将UINavigationBar.appearance() 功能用于全局方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-18
      • 2017-02-17
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      相关资源
      最近更新 更多