iOS判断颜色UIColor是浅色还是深色(DarkOrBright)

获取颜色的深浅这个需求并不少见,比如根据背景色来动态更改Label的文字颜色以让用户获得更好的阅读体验。

下面介绍一个简单的判断方法,可能不是最好的,但可以满足大部分需求。

颜色深很好理解,颜色浅就稍复杂一点,简单归为两种情况:

1.透明

2.不透明

不透明好办,不多做叙述。

对于透明,我自己在测试中发现可氛围两种情况来处理,一是全透明,二是部分透明。

我们看一下CGColor的一个方法:

1
2
/ Return the color components (including alpha) associated with `color’. /
CG_EXTERN const CGFloat *CGColorGetComponents(CGColorRef color)

这个方法可以取得颜色的分力,我们将用它来做颜色深浅的判断。上面的说明写的很清楚,包括透明度。但实际测试上,这个方法会把全透明判断为深色,所以对全透明我们做一个特别处理。

获取透明度代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (CGFloat) alphaForColor:(UIColor*)color {
CGFloat r, g, b, a, w, h, s, l;
BOOL compatible = [color getWhite:&w alpha:&a];
if (compatible) {
return a;
} else {
compatible = [color getRed:&r green:&g blue:&b alpha:&a];
if (compatible) {
return a;
} else {
[color getHue:&h saturation:&s brightness:&l alpha:&a];
return a;
}
}
}

判断颜色深浅代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-(BOOL)isDarkColor:(UIColor )newColor{
if ([self alphaForColor: newColor]<10e-5) {
return YES;
}
const CGFloat componentColors = CGColorGetComponents(newColor.CGColor);
CGFloat colorBrightness = ((componentColors[0] 299) + (componentColors[1] 587) + (componentColors[2] * 114)) / 1000;
if (colorBrightness < 0.5){
NSLog(@"Color is dark");
return YES;
}
else{
NSLog(@"Color is light");
return NO;
}
}

下一篇博文,我将对本篇做一点扩展,介绍获取图片颜色均值的方法。

热评文章