前两天有个朋友问我如何判断两个颜色的值是否相等,我想只要判断两个颜色的RGBA值是否相等不久可以了嘛,于是开始查找帮助文档找到了UIColor类,很容易就找到了函数:
- (BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha;
这样就可以判断两个UIColor对象的颜色是否相等,代码如下:
1: enum {
2: enEqual,
3: enNotEaual,
4: enCannotConvert,
5: };
6: typedef NSInteger KCompareResult;
7:
8: + (KCompareResult) isTheSameColor:(UIColor*)color
9: redValue:(CGFloat)rValue
10: greenValue:(CGFloat)gValue
11: blueValue:(CGFloat)bValue
12: alphaValue:(CGFloat)aValue
13: {
14:
15: if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) {
16:
17: CGFloat redValue, greenValue, blueValue, alphaValue;
18: if ([color getRed:&redValue green:&greenValue blue:&blueValue alpha:&alphaValue]) {
19: if (redValue == rValue && greenValue == gValue
20: && blueValue == bValue && alphaValue == aValue) {
21: return enEqual;
22: }
23: else {
24: return enNotEaual;
25: }
26: }
27: else { // can not convert
28: return enCannotConvert;
29: }
30: }
31: }
但是该函数只有ios5.0及以后才开始支持,如果是5.0版本之前就无法使用了。后来再想办法发现UIColor类还有个一个属性:
@property(nonatomic, readonly) CGColorRef *CGColor
该属性可以获取到当前颜色的quartz color reference,然后再顺藤摸瓜就可以使用代码段(二)就可以获取到颜色值
1: CGColorRef colorRef = color.CGColor;
2: NSInteger numberComponents = CGColorGetNumberOfComponents(colorRef);
3: const CGFloat *components = CGColorGetComponents(colorRef);4:
5: for (int i = 0; i < numberComponents; i++) {6: NSLog(@"components %d is %f", i, components[i]);7: }
通过测试可以发现,如果CGColorRef有四个组成部分的,一次分别代表Red,Green,Blue,Alpha,这样就可以解决ios5.0之前获取UIColor的颜色值,获取到颜色信息后就可以很容易的判断两个颜色是不是一样的。
写好之后测试时候发现使用isTheSameColor传入[UIColor whiteColor]以及RGBA的值分别为1,1,1,1时,得出的结果是enCannotConvert,证明从whiteColor得到的UIColor对象不能转换到RGBA。使用上面的代码段打印CGColor的components得知[UIColor whiteColor]只有两个组成部分,也就印证了该颜色不是RGBA空间的。
看来只得另想办法,后来转念一想当初的目的只是为了判断两个UIColor是否相等,于是根据两个UIColor.CGColor来判断,查看文档又发现一个重要的函数
bool CGColorEqualToColor (CGColorRef color1, CGColorRef color2);
改进后的颜色比较函数如下:
1: + (BOOL) isTheSameColor2:(UIColor*)color1 anotherColor:(UIColor*)color2
2: {
3: if (CGColorEqualToColor(color1.CGColor, color2.CGColor)) {
4: return YES;
5: }
6: else {
7: return NO;
8: }
9: }
只要根据UIColor获取到的CGColor是否相等就可以判断这两个UIColor是否相等了。
发的第一篇帖子,欢迎拍砖!