UIColor 动态提供程序块有时会收到错误的 userInterfaceStyle

Yur*_*eis 5 ios swift ios13 ios-darkmode

我正在更新一堆颜色以支持新的 iOS 13 暗模式。我通过新的动态提供程序块构造函数以编程方式使用它们。这里的问题是,有时会使用错误的userInterfaceStyle属性值调用块,导致颜色返回错误的值(有时是暗而不是亮,有时是亮而不是暗)。

根据我的理解,我不需要traitCollection使用这个新的构造函数来监听更改或任何类型的事情。它应该自动执行(还是我错了?)。

有趣的是,我尝试通过资产目录使用一些虚拟颜色来完成它,但它也不起作用。还尝试使用一些新系统提供的动态颜色,如 .systemBackgroundColor。有时它还可以解决颜色错误。

if #available(iOS 13.0, *) {
    return UIColor { (traitCollection: UITraitCollection) -> UIColor in
        if traitCollection.userInterfaceStyle == .dark {
            return darkColor
        }
        else {
            return lightColor
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,究竟应该发生什么?这应该像我期望的那样工作还是我绝对需要在特定位置(如 insideviewWillLayoutSubviewstraitCollectionDidChange)分配颜色?

使用.resolvedColor(with: UITraitCollection)作品手动解析颜色。但是根据我从文档中的理解,我不需要像这样手动解决它。

Yur*_*eis 6

好的,所以我找到了问题的根源。将动态颜色设置为 anavigationBar或 a 时searchBar,请注意barStyle视图的属性。我.dark用于导航栏(用白色文本显示状态栏)。这导致 UIColor 动态提供程序解析错误的颜色。改变它.default为我修复它。

对于searchBar,我没有设置任何具体的东西。强迫它.default也修复它。