gpt4 book ai didi

swift - 检测 iOS 暗模式更改

转载 作者:行者123 更新时间:2023-12-03 09:15:39 26 4
gpt4 key购买 nike

我通读了有关以下内容的文档:https://developer.apple.com/documentation/appkit/supporting_dark_mode_in_your_interface

When the user changes the system appearance, the system automatically asks each window and view to redraw itself. During this process, the system calls several well-known methods for both macOS and iOS, listed in the following table, to update your content.



在我们的遗留应用程序中,我们在每个类的 init 中将 View 创建为惰性变量。这意味着如果用户进入设置并切换到暗模式, View 将不会以正确的颜色绘制。

If you make appearance-sensitive changes outside of these methods, your app may not draw its content correctly for the current environment. The solution is to move your code into these methods.



我们的应用程序非常大,将来会进行重构以更好地支持这一点,但我想知道是否有一种方法可以通过通知中心检测此更改,例如可以为 Mac OS 执行的操作:

How to detect switch between macOS default & dark mode using Swift 3

最佳答案

swift 5:
traitCollectionDidChange 也会被调用几次。这就是我检测 DarkMode 运行时更改和 setColors() 的方式。

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)

setColors()
}
在 setColors() func 中,我更新了颜色。
检测当前颜色方案:
extension UIViewController {
var isDarkMode: Bool {
if #available(iOS 13.0, *) {
return self.traitCollection.userInterfaceStyle == .dark
}
else {
return false
}
}

}
我有这样定义的颜色(对于 iOS < 13):
enum ColorCompatibility {
static var myOlderiOSCompatibleColorName: UIColor {
if UIViewController().isDarkMode {
return UIColor(red: 33, green: 35, blue: 37, alpha: 0.85)
}
else {
return UIColor(hexString: "#F3F3F3", alpha: 0.85)
}
}
}
例子:
private func setColors() {
myView.backgroundColor = ColorCompatibility.myOlderiOSCompatibleColorName
}
此外,您可能需要根据您的情况在 ViewDidLoad/Will/DidAppear 中调用 setColors,如下所示:
viewDidLoad() {
...
setColors()
...
}
对于 iOS11+,您可以使用“命名颜色”,在 Assets 中定义并且在 IB 中更容易使用。
干杯

关于swift - 检测 iOS 暗模式更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57706671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com