CSS 常用的颜色表示方式有 3 种:
- 十六进制数字:
#123456
- RGB 方式:
rgb(18, 52, 86)
- HLS 方式:
hls(210, 65%, 20%)
以上 3 种方式都可以表示 #123456 这个颜色
在 UIColor 里,也有对应的方法:
a. RGB 和十六进制数字使用的方法
[UIColor colorWithRed:18/255.0 green:52/255.0 blue:86/255.0 alpha:1];
b. HSB 使用的方法
[UIColor colorWithHue:210/360.0 saturation:0.65 brightness:0.2 alpha:1];
出来的效果是这样的:
左边是 a 输出的颜色,右边是 b 输出的颜色,很明显 b 得到的颜色是不对的。
因为 b 使用的是 HSB 而不是 HSL。
- HSB 也叫 HSV,是指:色相,饱和度,明度
- HSL 是指:色相,饱和度,亮度
它们概念不一样,所以直接套 css 里的 hsl 参数给 UIColor 里的 hsb 得到的颜色就是错误的,都使用 RGB 是比较靠谱的方式。
另一种方法是把 HSL 转换为 HSB,UIColor 就可以处理了,添加两个分类方法:
- (instancetype)initWithHue:(CGFloat)hue saturation:(CGFloat)saturation lightness:(CGFloat)lightness alpha:(CGFloat)alpha {
CGFloat brightness = saturation * MIN(lightness, 1 - lightness) + lightness;
saturation = brightness ? 2 - 2 * lightness / brightness : 0;
return [self initWithHue:hue saturation:saturation brightness:brightness alpha:alpha];
}
- (BOOL)getHue:(nullable CGFloat *)hue saturation:(nullable CGFloat *)saturation lightness:(nullable CGFloat *)lightness alpha:(nullable CGFloat *)alpha {
CGFloat h = 0, s = 0, b = 0, a = 0;
if (![self getHue:&h saturation:&s brightness:&b alpha:&a]) {
return NO;
}
CGFloat l = b - b * s / 2;
CGFloat m = MIN(l, 1 - l);
s = m ? (b - l) / m : 0;
if (hue) *hue = h;
if (saturation) *saturation = s;
if (lightness) *lightness = l;
if (alpha) *alpha = a;
return YES;
}
现在就可以直接使用 CSS 里的 HSL 参数了:
[UIColor colorWithHue:210/360.0 saturation:0.65 lightness:0.2 alpha:1];