我已经通过添加
更新了应用中的视图以支持暗模式 if #available(iOS 12.0, *) {
if self.traitCollection.userInterfaceStyle == .dark {
//Adapt to dark Bg
} else {
//Adapt to light Bg
}
}
然后,考虑到用户后台应用程序并在切换模式后返回到该应用程序的情况,我在viewDidLoad中附加了一个观察者
if #available(iOS 12.0, *) {
NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
} else {
// Fallback on earlier versions
}
触发功能
@available(iOS 12.0, *)
@objc func willEnterForeground() {
if self.traitCollection.userInterfaceStyle == .dark {
print("App moving to foreground - dark")
//Adapt to dark Bg
} else {
print("App moving to foreground - light")
//Adapt to light Bg
}
}
但是,self.traitCollection.userInterfaceStyle
仍然给出旧值,因此需要完全重载视图才能对接口产生所需的更新。
相反,使用UIApplication.didBecomeActiveNotification
没什么区别。
答案 0 :(得分:3)
您不需要所有那些凌乱的if语句!只需将颜色添加到“资产目录”中,就会自动选择正确的颜色。这类似于添加x1
,x2
和x3
图像的方式,然后将选择正确的图像。
转到“资产目录”,然后在左下方单击加号按钮,选择“新颜色集”:
给颜色命名,然后在属性检查器中将“外观”设置为“任意,黑暗”:
为每种外观选择颜色:
最后,使用UIColor(named:)
初始化程序初始化颜色,当设备的暗模式设置更改时,颜色将自动更改:
someView.backgroundColor = UIColor(named: "myColor")
编辑:
如果仅在运行时知道颜色,则可以使用init(dynamicProvider:)
初始化程序(仅适用于iOS 13):
someView.backgroundColor = UIColor {
traits in
if traits.userInterfaceStyle == .dark {
// return color for dark mode
} else {
// return color for light mode
}
}