某些 UI 设置无法在暗/亮模式下自动工作,因为UIColor. 例如shadow在图层中。因为我需要在明暗模式下删除和放置阴影,所以我需要在某个地方放置updateShadowIfNeeded()函数。我知道如何检测当前的模式:
func dropShadowIfNeeded() {
switch traitCollection.userInterfaceStyle {
case .dark: removeShadow()
case .light: dropShadowIfNotDroppedYet()
default: assertionFailure("Unknown userInterfaceStyle")
}
}
Run Code Online (Sandbox Code Playgroud)
现在我把这个函数放在 里面layoutSubviews,因为每次外观改变时它都会被调用:
override func layoutSubviews() {
super.layoutSubviews()
dropShadowIfNeeded()
}
Run Code Online (Sandbox Code Playgroud)
但是这个函数被调用了很多。只有在userInterfaceStyle更改时才触发的正确功能是什么?
我通读了有关以下内容的文档:https : //developer.apple.com/documentation/appkit/supporting_dark_mode_in_your_interface
当用户更改系统外观时,系统会自动要求每个窗口和视图重绘自身。在此过程中,系统将为macOS和iOS调用下表中列出的几种众所周知的方法来更新您的内容。
在我们的旧版应用程序中,我们在每个类的初始化中将我们的视图创建为惰性变量。这意味着如果用户进入设置并切换到暗模式,则不会以正确的颜色绘制出w。
如果您在这些方法之外进行外观敏感的更改,则您的应用可能无法针对当前环境正确绘制其内容。解决方案是将代码移入这些方法。
我们的应用程序很大,将来会进行重构以更好地支持此功能,但我想知道是否可以通过通知中心检测到此更改,例如可以对Mac OS进行的操作: