在我的应用程序中,当iOS系统的暗模式设置发生变化时,我需要做一些定制的UI更改。根据https://developer.apple.com/videos/play/wwdc2019/214/,明确提到了如何实现traitCollectionDidChange,并使用hasDifferentColorAppearance(comparedTo:)比较以前的和当前的特征集合。
文件上说:
使用此方法来确定更改当前环境的特征是否也会改变界面中的颜色。例如,更改userInterfaceStyle或accessibilityContrast属性通常会更改接口的颜色。
在我的视图控制器的子类中,我实现了
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的话,这是我所没有想到的。我不喜欢苹果建议的API使用,但另一方面,如果userInterfaceStyle没有真正改变,我不想对我的UI进行不必要的更改。因此,我不确定是否应该依赖hasDifferentColorAppearance(comparedTo:)的结果,或者仅仅比较这两个特性集合的userInterfaceStyle是否就足够了。
发布于 2019-09-20 08:21:12
对这两种特征集合的深入研究揭示了当前特性集合的userInterfaceLevel属性是.elevated。所有其他属性都是相同的。userInterfaceLevel值的变化是由于将另一个视图控制器作为弹出器而引起的。考虑到这一事实,我需要另外检查self.traitCollection.userInterfaceStyle != previousTraitCollection?.userInterfaceStyle,以确定暗/光外观是否真的发生了变化。
https://stackoverflow.com/questions/57993277
复制相似问题