首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检测颜色类型(深色或浅色)

检测颜色类型(深色或浅色)
EN

Stack Overflow用户
提问于 2020-09-26 05:23:14
回答 1查看 164关注 0票数 0

我正在尝试检测SwiftUI中的颜色类型(深色或浅色),以相应地更改文本颜色。但是有些地方不对劲,它总是给出亮度的值: 0.41437413557767866。

代码语言:javascript
运行
复制
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

    }
}

我还尝试了一些类似的东西:

代码语言:javascript
运行
复制
color.cgColor?.components

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

我想要实现的东西是这样的:

这里的文本应该是轻便的,以便清晰:

这里的文本应该是深色的,这样才能清楚:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-26 09:19:20

我试过你照片里的颜色:

我得到了预期的答案:

代码语言:javascript
运行
复制
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

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

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

所以你的代码运行得很好--就它本身而言。也许您使用的公式不是您真正想要的公式,但是公式本身的行为是正确的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64071466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档