swift - 检测颜色类型(深色或浅色)
问题描述
我正在尝试检测 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
我想要实现的是这样的:
这里的文字应该很清楚:
这里的文字应该是暗的才能清楚:
解决方案
我试过你图片中的颜色:
我得到了完全预期的答案:
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
)。
因此,您的代码运行良好——就其本身而言。也许您使用的公式不是您真正想要的公式,但公式本身的行为正确。
推荐阅读
- sql - 使用统计函数的 SQL 别名不起作用
- spring-boot - 使用 Springboot PropertiesFactoryBean 的自动装配问题
- amazon-web-services - Boto3 S3 错误 - 调用 PutObjectAcl 时访问被拒绝
- google-cloud-platform - google.api_core.exceptions.PermissionDenied: 403 调用者没有权限
- html - 在 HTML 中移动选取框/下移文本
- python - 如何在 python 3 中创建一个循环,当您输入正确的单词/数字时停止
- php - 警告:mail():无法在“localhost”端口 25 连接到邮件服务器
- bitbucket - 一个文件夹未上传到 bitbucket
- xamarin - 如何在 xamarin 表单中自定义相机的宽度?
- python - 我想调用 first.py 中可用的代码,然后将其包装在函数中。然后在 second.py 中导入该函数并调用