我正在尝试检测SwiftUI中的颜色类型(深色或浅色)以相应地更改文本颜色。但是出了点问题,它总是将亮度值设为0.41437413557767866。
struct InfoView: View {
let text: String
var body: some View {
Text(text)
.foregroundColor(isDarkBackground(color: Color.accentColor) ? .darkText : .lightText)
.background(Color.accentColor)
}
}
private extension InfoView {
func isDarkBackground(color: Color) -> Bool {
var r, g, b, a: CGFloat
(r, g, b, a) = (0, 0, 0, 0)
UIColor(color).getRed(&r, green: &g, blue: &b, alpha: &a)
let luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b
logger(luminance)
return luminance < 0.50
}
}
我也尝试过类似的事情:
color.cgColor?.components
获取颜色的成分,然后计算亮度,但返回零
我想要实现的是这样的:
此处的文字应简洁明了:
这里的文字应该是深色的以便清晰:
答案 0 :(得分:0)
我尝试过您照片中的颜色
我完全得到了预期的答案:
isDarkBackground(color:Color(.sRGB, red: 0.346, green: 0.339, blue: 0.836, opacity: 1))
isDarkBackground(color:Color(.sRGB, red: 0.350, green: 0.784, blue: 0.987, opacity: 1))
// 0.37637156163454055, true
// 0.7063881726026535, false
所以也许您的真实代码中输入的颜色不是您认为的颜色。
您对亮度的理解可能也会有一些问题。我用isDarkBackground
尝试了您的Color.blue
,并且得到了您的0.41437413557767866
(即true
)。但是现在尝试使用Color.yellow
;您得到0.7847599958539009
(即false
)。
因此,您的代码可以正常工作-就是这样。也许您正在使用的公式不是您真正想要的公式,但是该公式本身的行为正确。