判断两个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的颜色值,获取到颜色信息后就可以很容易的判断两个颜色是不是一样的。

      判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个UIColor的颜色值是否相等判断两个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是否相等了。

 

     发的第一篇帖子,欢迎拍砖!判断两个UIColor的颜色值是否相等


部门招人: 高级iOS、Android、前端开发,有意私聊,博主请你喝️
如果觉得本文帮到了你,记得点赞哦,当然也可以请博主喝一杯豆浆
判断两个UIColor的颜色值是否相等 判断两个UIColor的颜色值是否相等
微信二维码 QQ二维码
上一篇:第16 17章节-Python3.5-Django知识点整理 15


下一篇:第05章节-Python3.5-Django的CBV和FBV 4