在我的应用程序中,当 iOS 系统暗模式设置发生变化时,我需要进行一些自定义 UI 更改。根据https://developer.apple.com/videos/play/wwdc2019/214/明确提到要实现 traitCollectionDidChange
并使用 hasDifferentColorAppearance(comparedTo:)
比较之前和当前的特征集合。
文档说:
Use this method to determine whether changing the traits of the current environment would also change the colors in your interface. For example, changing the userInterfaceStyle or accessibilityContrast property usually changes the colors of your interface.
在我实现的 View Controller 的子类中
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if #available(iOS 13.0, *),
self.traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
let isSameUserInterfaceStyle = (self.traitCollection.userInterfaceStyle == previousTraitCollection?.userInterfaceStyle)
let isSameAcessibilityContrast = (self.traitCollection.accessibilityContrast == previousTraitCollection?.accessibilityContrast)
// do custom stuff
}
}
但在某些情况下,isSameUserInterfaceStyle
和 isSameAcessibilityContrast
都评估为 true
如果 hasDifferentColorAppearance(comparedTo:)
也返回 true
。
我不喜欢使用 Apple 建议的 API 用法,但另一方面,如果 userInterfaceStyle
实际上没有更改,我不想对我的 UI 进行不必要的更改。所以我不确定我是否应该依赖 hasDifferentColorAppearance(comparedTo:)
的结果,或者是否只比较两个特征集合的 userInterfaceStyle
就足够了。
最佳答案
对两个特征集合的更深入调查表明,当前特征集合的 userInterfaceLevel
属性设置为 .elevated
。所有其他特性都相同。 userInterfaceLevel
值的变化是由将另一个 View Controller 呈现为弹出窗口引起的。考虑到这个事实,我需要额外检查 self.traitCollection.userInterfaceStyle != previousTraitCollection?.userInterfaceStyle
以确定暗/亮外观是否实际发生了变化。
关于ios - 评估 UITraitCollection 的 hasDifferentColorAppearance(与 :) result 相比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57993277/