【问题标题】:Evaluating UITraitCollection's hasDifferentColorAppearance(comparedTo:) result评估 UITraitCollection 的 hasDifferentColorAppearance(comparedTo:) 结果
【发布时间】:2020-01-19 10:35:21
【问题描述】:

在我的应用程序中,当 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,如果 hasDifferentColorAppearance(comparedTo:) 也返回 true,我没想到。 我不喜欢解决 Apple 建议的 API 用法,但另一方面,如果 userInterfaceStyle 实际上没有改变,我不想对我的 UI 进行不必要的更改。所以我不确定我是否应该依赖hasDifferentColorAppearance(comparedTo:) 的结果,或者仅比较两个特征集合的userInterfaceStyle 就足够了。

【问题讨论】:

  • 发生这种情况时能否打印两个特征集合?也许还有其他事情发生......
  • @RTasche 您应该将其作为完整答案发布在下面。这是一个有趣的信息。

标签: ios swift uitraitcollection ios-darkmode


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-07-17
    • 2013-01-27
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多