Swift中检测Color类型黑白颜色异常 仅能识别黑色无法识别白色
问题根因
SwiftUI的Color类型本质是动态颜色提供者,不是静态RGBA值的容器,直接用==比较两个Color实例时,不会只对比实际显示的RGB数值,还会对比颜色的创建来源、是否为动态适配颜色等元信息,因此只要两个颜色的创建路径不一样,哪怕视觉上完全一致,==也会返回false。你的黑色能匹配上属于巧合,刚好你手动创建的黑色实例和用户选择的黑色元信息一致,白色创建路径不一致所以匹配失败。
解决方案
不要直接比较Color实例,先把Color转换成静态RGBA数值再做对比,同时加入浮点精度容错避免计算误差导致匹配失败,修改后的完整代码如下:
import SwiftUI // 扩展Color获取RGBA数值 extension Color { func getRGBA() -> (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) { let uiColor = UIColor(self) var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0 uiColor.getRed(&red, green: &green, blue: &blue, alpha: &alpha) return (red, green, blue, alpha) } } struct AvatarImageModifier : ViewModifier { @Environment(\.colorScheme) var colorScheme var avatarColor:Color? func body(content: Content) -> some View { content .background(bgColor(bgColor: avatarColor)) } func bgColor(bgColor: Color?)->Color{ var col:Color = .systemBackground guard let bgColor = bgColor else { return col } let rgba = bgColor.getRGBA() // 浮点精度容错值 let tolerance: CGFloat = 0.01 let isBlack = abs(rgba.red) < tolerance && abs(rgba.green) < tolerance && abs(rgba.blue) < tolerance let isWhite = abs(rgba.red - 1) < tolerance && abs(rgba.green - 1) < tolerance && abs(rgba.blue - 1) < tolerance if isBlack { col = colorScheme == .dark ? .systemGray3 : .systemBackground } else if isWhite { // 补充深色模式下白色头像的背景逻辑 col = colorScheme == .light ? .systemGray3 : .systemBackground } return col } }
修改后不管用户是从颜色选择器选的白/黑,还是其他方式创建的同色值颜色,都可以正常识别,同时兼容深浅模式的显示需求。
内容的提问来源于stack exchange,提问作者fs_tigre
相关产品推荐
相关产品推荐

