我正在尝试在我的应用中实现暗模式切换-这将涉及到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
来更改视图的背景颜色一样,这将实际更新颜色时间在屏幕上。
答案 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
}
}