ios - 如何正确获取和设置 UIView 的 UIColor?
问题描述
我正在尝试根据其当前颜色更改UIView
a 。backgroundColor
例如说 MyView 现在是红色的,触摸时我想让它变成蓝色,反之亦然。但我注意到我无法获得正确的名称UIColor
来检查当前颜色。
例如,如果我这样做:
if MyView.backgroundColor == .systemRed {
print("Red")
} else {
print("Not red")
}
这将始终打印“非红色”,即使我明确设置MyView.backgroundColor = .systemRed
当我检查正在使用的颜色时:
print("Color = \(MyView.backgroundColor)")
它打印:[...] name = systemRedColor
但是当我更改.systemRed
为时.systemRedColor
,它给出了错误
'systemRedColor' has been renamed to 'systemRed'
我又回到了我开始的地方。
谁能告诉我我错过了什么?如何正确读取和设置backgroundColor
of UIView
?
解决方案
.systemRed
是动态系统颜色之一,将根据视图的当前特征条件(即暗模式/亮模式)以不同方式显示。因此,您需要使用该.resolvedColor(with traitCollection:)
功能访问当前颜色。
在Light Mode 下,systemRed
将显示为: UIExtendedSRGBColorSpace 1 0.231373 0.188235 1 R255 G59 B48
在深色模式下,systemRed
将显示为: UIExtendedSRGBColorSpace 1 0.270588 0.227451 1 R255 G69 B58
if view.backgroundColor?.resolvedColor(with: view.traitCollection) == UIColor.systemRed.resolvedColor(with: view.traitCollection) {
print("true")
}
这将适用于动态和标准UIColor
的。
你也可以做一个扩展UIColor
来做到这一点
extension UIColor {
class func compare(_ colorA: UIColor?, with colorB: UIColor?, in view: UIView) -> Bool {
colorA?.resolvedColor(with: view.traitCollection) == colorB?.resolvedColor(with: view.traitCollection)
}
}
用法:
if UIColor.compare(self.view.backgroundColor, with: .systemRed, in: view) {
print("true")
}
推荐阅读
- javascript - addEventListener:点击并移除标签
- rust - 如何使用对 FnOnce 闭包的引用?
- mysql - CRUD notes - 为笔记离线创建 ID
- java - 如何让 Discord Bot 等待特定用户使用 JDA 发送消息?
- java - 从另一个类访问正在运行的应用程序类
- c# - 正则表达式匹配基本路径
- mysql - MySQL - 用第 2 行的第 2 列减去第 1 行的第 1 列
- excel - 无法将剪贴板中的数据范围粘贴到其他工作簿的选定单元格
- jupyter-notebook - 在 Daru 中,如何在单个 Cell 中显示多个 DataFrame?
- google-dl-platform - 可以启动在不同实例类型上创建的磁盘映像吗?