gpt4 book ai didi

ios - UIColor 返回暗模式颜色的错误值

转载 作者:可可西里 更新时间:2023-11-01 00:18:51 24 4
gpt4 key购买 nike

我有一个自定义的 UITextField 子类,当在其中输入内容时,它会更改其边框颜色。我正在通过调用监听变化

self.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)

然后,在 textFieldDidChange(_:) 中我正在做:

self.layer.borderColor = UIColor(named: "testColor")?.cgColor

其中 testColor 是在 Assets.xcassets 中定义的颜色,具有浅色和深色模式的变体。问题是 UIColor(named: "testColor")?.cgColor 似乎总是返回灯光模式的颜色。

这是 iOS 13 测试版中的错误还是我做错了什么?有 a GitHub repo使用表现出这种行为的代码。运行项目,从 XCode 切换到深色模式,然后开始在文本字段中输入内容。

最佳答案

简答

在这种情况下,您需要指定使用哪个特征集合来解析动态颜色。

self.traitCollection.performAsCurrent {
self.layer.borderColor = UIColor(named: "testColor")?.cgColor
}

self.layer.borderColor = UIColor(named: "testColor")?.resolvedColor(with: self.traitCollection).cgColor

更长的答案

当您在动态 UIColor 上调用 cgColor 方法时,它需要解析动态颜色的值。这是通过引用当前特征集合 UITraitCollection.current 来完成的。

当前特征集合由 UIKit 在调用您对某些方法的重写时设置,特别是:

  • 界面 View
    • 绘制()
    • 布局 subview ()
    • traitCollectionDidChange()
    • tintColorDidChange()
  • UIViewController
    • viewWillLayoutSubviews()
    • viewDidLayoutSubviews()
    • traitCollectionDidChange()
  • UIPresentationController
    • containerViewWillLayoutSubviews()
    • containerViewDidLayoutSubviews()
    • traitCollectionDidChange()

但是,除了重写这些方法之外,当前特征集合不一定设置为任何特定值。因此,如果您的代码未覆盖其中一种方法,并且您想要解析动态颜色,则您有责任告诉我们要使用的特征集合。

(这是因为可以覆盖任何 View 或 View Controller 的 userInterfaceStyle 特性,因此即使设备可能设置为亮模式,您也可能有一个处于暗模式的 View 。)

您可以通过使用 UIColor 方法直接解析动态颜色来做到这一点 resolvedColor(with:) .或者使用 UITraitCollection 方法 performAsCurrent ,并将解析颜色的代码放入闭包中。上面的简短回答显示了两种方式。

您也可以将您的代码移至其中一种方法中。在这种情况下,我认为您可以将其放在 layoutSubviews() 中。如果这样做,它会在亮/暗样式更改时自动调用,因此您无需执行任何其他操作。

引用

WWDC 2019, Implementing Dark Mode in iOS

从 19:00 开始我讲了如何解决动态颜色,在 23:30 我展示了一个例子如何将 CALayer 的边框颜色设置为动态颜色,就像你在做什么。

关于ios - UIColor 返回暗模式颜色的错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57165239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com