3

在我的应用程序中,当 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
        }
    }

但在某些情况下,两者isSameUserInterfaceStyleisSameAcessibilityContrast评估true我没想到 ifhasDifferentColorAppearance(comparedTo:)也会返回true。我不喜欢解决 Apple 建议的 API 用法,但另一方面,如果userInterfaceStyle没有实际更改,我不想对我的 UI 进行不必要的更改。所以我不确定我是否应该依赖的结果,或者仅比较两个特征集合hasDifferentColorAppearance(comparedTo:)是否就足够了。userInterfaceStyle

4

1 回答 1

0

对这两个特征集合的更深入调查表明当前特征集合的userInterfaceLevel属性已设置.elevated。所有其他属性都是相同的。值的变化userInterfaceLevel是由于将另一个视图控制器呈现为弹出框而引起的。考虑到这一事实,我需要另外检查self.traitCollection.userInterfaceStyle != previousTraitCollection?.userInterfaceStyle以确定暗/亮外观是否确实发生了变化。

于 2019-09-20T08:21:12.097 回答