判断两个UIColor的颜色值是否相等

  

前两天有个朋友问我如何判断两个颜色的值是否相等,我想只要判断两个颜色的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的颜色值,获取到颜色信息后就可以很容易的判断两个颜色是不是一样的。

      Winking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smileWinking smile

     写好之后测试时候发现使用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是否相等了。

 

     发的第一篇帖子,欢迎拍砖!Smile

posted on 2011-12-12 20:35  一片-枫叶  阅读(9192)  评论(4编辑  收藏  举报