如何在Swift中将UIColor转换为3/4/6/8位十六进制字符串?
如何获取特定的颜色值?例如,通过调用UIColor.blue.eightDigitsString
来获取"#0000FFFF"。
请参见这个链接:
5.2. RGB十六进制表示法:#RRGGBBCSS十六进制颜色表示法使用十六进制数字来指定颜色的通道,类似于在计算机代码中直接编写颜色。它也比使用rgb()表示法更短。
一个十六进制颜色的语法是一个<hash-token>令牌,其值由3、4、6或8个十六进制数字组成。换句话说,十六进制颜色写为一个井号字符,"#", 后跟一些数字0到9或字母a-f(字母的大小写不重要 - #00ff00与#00FF00相同)。
给定的十六进制数字的位数决定了如何将十六进制表示法解码为RGB颜色:
6个数字
解释为十六进制数值的第一对数字指定颜色的红色通道,其中00表示最小值,ff(255的十进制)表示最大值。下一对数字以同样的方式解释,指定绿色通道,最后一对数字指定蓝色通道。颜色的alpha通道完全不透明。 换句话说,#00ff00表示与rgb(0 255 0)相同的颜色(青柠绿)。
8个数字
前6个数字的解释方式与6位表示法相同。解释为十六进制数值的最后一对数字指定颜色的alpha通道,其中00表示完全透明的颜色,ff表示完全不透明的颜色。 换句话说,#0000ffcc表示与rgb(0 0 100% / 80%)相同的颜色(略带透明的蓝色)。
3个数字
这是6位表示法的简短变体。解释为十六进制数值的第一个数字指定颜色的红色通道,其中0表示最小值,f表示最大值。接下来的两个数字分别以同样的方式表示绿色和蓝色通道。颜色的alpha通道完全不透明。 这种语法通常被解释为通过“复制”所有数字得到的6位表示法相同。例如,符号#123表示与符号#112233相同的颜色。使用3位十六进制语法来指定颜色比6位十六进制语法具有更低的“分辨率”;在3位十六进制语法中只有4096种可能的颜色,而6位十六进制语法中有约1700万种颜色。
4个数字
这是8位表示法的简短变体,在3位表示法中以同样的方式“扩展”。解释为十六进制数值的第一个数字指定颜色的红色通道,其中0表示最小值,f表示最大值。接下来的三个数字分别表示绿色、蓝色和alpha通道。
现在我已经知道如何将UIColor
对象转换为6位十六进制字符串。但是我不确定如何将它转换为3位/4位/8位十六进制字符串以及需要注意什么。
guard let components = cgColor.components, components.count >= 3 else {
return nil
}
let r = Float(components[0])
let g = Float(components[1])
let b = Float(components[2])
var a = Float(1.0)
if components.count >= 4 {
a = Float(components[3])
}
if alpha {
// rrggbbaa mode
// is there any difference between rrggbbaa and aarrggbb?
return String(format: "%02lX%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255), lroundf(a * 255))
} else {
// rrggbb mode
return String(format: "%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255))
}
注意:它是将 UIColor
转换为字符串,而不是将字符串转换为 UIColor
UIColor
转换为十六进制代码。 - rmaddy