SwiftUI 自定义hex转Color扩展初始化颜色与输入hex值不匹配问题
问题原因
sRGB 色彩空间的 Color 初始化方法要求 red/green/blue 三个参数的取值范围为 0~1 的浮点数,你当前代码直接传入了 0~255 区间的原始数值,所有大于1的色值都会被系统默认截断为1,最终渲染出来的颜色自然和目标色不符。
修正后的代码
extension Color { init(hexColor: String) { // 过滤非字母数字字符,自动去除#等前缀符号 let hex = hexColor.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) let hexNumber = Int(hex, radix: 16) ?? 0 // 将0~255区间的原始色值转换为0~1区间的标准参数 let redColor: Double = Double((hexNumber >> 16) & 0xFF) / 255.0 let greenColor: Double = Double((hexNumber >> 8) & 0xFF) / 255.0 let blueColor: Double = Double((hexNumber >> 0) & 0xFF) / 255.0 self.init(.sRGB, red: redColor, green: greenColor, blue: blueColor, opacity: 1) } }
可选优化点
- 新增3位短hex格式兼容,比如将
#FFF自动补全为#FFFFFF再做计算 - 新增8位带透明通道的hex支持,取hex最高两位数值计算alpha透明度参数
内容的提问来源于stack exchange,提问作者Rajesh Budhiraja
相关产品推荐
相关产品推荐

