动态更改iOS导航栏颜色(深色模式)

时间:2019-09-19 23:38:31

标签: ios swift uiviewcontroller uinavigationcontroller uinavigationitem

我正在尝试在我的应用中实现暗模式切换-这将涉及到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发布之前在IN-APP中具有黑暗模式)。我需要做的是在屏幕上已经显示后动态更新UINavigationBar的颜色,就像我可以通过执行view.backgroundColor = .white来更改视图的背景颜色一样,这将实际更新颜色时间在屏幕上。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:-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是我的UIViewController,而topBarHeight是:

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
    }
 }