首页 > 解决方案 > 检测颜色类型(深色或浅色)

问题描述

我正在尝试检测 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

获取颜色的分量,然后计算亮度,但它返回 nil

我想要实现的是这样的:

这里的文字应该很清楚:

这里的文字应该是浅显易懂的

这里的文字应该是暗的才能清楚:

这里的文字应该是暗的才能清楚

标签: swiftswiftui

解决方案


我试过你图片中的颜色:

在此处输入图像描述 在此处输入图像描述

我得到了完全预期的答案:

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

因此,您实际代码中的输入颜色可能不是您认为的颜色。

您对什么是亮度的理解也可能存在一些问题。我试过你isDarkBackgroundColor.blue,我得到了你的0.41437413557767866(就是true)。但现在尝试使用Color.yellow; 你得到0.7847599958539009(即false)。

因此,您的代码运行良好——就其本身而言。也许您使用的公式不是您真正想要的公式,但公式本身的行为正确。


推荐阅读