我有一个接受UIColor的函数。
func getColor(_ background: UIColor) -> UIColor {
switch background {
case .white, .systemBrown:
return .black
case .darkGray:
return .lightGray
case .black:
return .white
default:
return .label
}
}
我有一个带背景颜色UIButton
let brownButton: UIButton = {
let btn = UIButton()
btn.translatesAutoresizingMaskIntoConstraints = false
btn.backgroundColor = .systemBrown
btn.layer.borderWidth = 1.0
btn.layer.borderColor = UIColor.brown.cgColor
return btn
}()
当我这样调用函数时:
getColor(brownButton.backgroundColor!)
它返回.label(默认情况下)。但当我使用:
getColor(.systemBrown)
我得到了预期的结果
2条答案
按热度按时间ppcbkaq51#
“系统”颜色是动态的,取决于它们所应用到的特征集合。
打印各种颜色可让您了解不同之处:
输出为:
背景:〈UID动态修改颜色:0x 60000394 d 6 e0的最大值;对比度=正常,基色=〈UID动态目录系统颜色:0x 600002277000的整数倍;名称=系统棕色颜色〉〉
系统棕色:动态目录系统颜色:0x 600002277000的整数倍;名称=系统棕色颜色〉
这表示将
systemBrown
颜色应用于视图时,颜色的属性发生了一些变化。这意味着它不再等同于“普通”的systemBrown
颜色。一种解决方案是将所有相关的颜色解析为适当的特征集合。
通过解析
case
语句中使用的任何动态颜色来更新getColors
:然后将您的呼叫更新为
getColors
:您需要解析传递的背景颜色,并将视图的
traitCollection
传递给getColors
。如果您总是使用视图的
backgroundColor
,则可以将getColors
更改为只使用UIView
参数,并根据需要解析该函数中的颜色。qnakjoqk2#
这可能是因为系统正在对背景颜色进行某些操作,如对背景颜色应用色调。
我建议记录UIColor.systemBrown和brownButton的backgroundColor的RGB和alpha值。您可能会发现它们略有不同。在这种情况下,您可能需要编写一个"颜色接近另一种颜色"的比较。(假设R、G和B分量彼此之间的差值在0.02以内,或者0 - 255之间的整数值在5以内。我只是凭空得出了这些范围,但它们可能是一个很好的起点。)
大概是这样的: