前兩天有個朋友問我如何判斷兩個顏色的值是否相等,我想只要判斷兩個顏色的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) CIColor *CIColor
該屬性可以擷取到使用中色彩的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是否相等了。
發的第一篇文章,歡迎拍磚!