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

简介:    前两天有个朋友问我如何判断两个颜色的值是否相等,我想只要判断两个颜色的RGBA值是否相等不久可以了嘛,于是开始查找帮助文档找到了UIColor类,很容易就找到了函数: - (BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(...

  

前两天有个朋友问我如何判断两个颜色的值是否相等,我想只要判断两个颜色的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


部门招人: 高级iOS、Android、前端开发,有意私聊,博主请你喝️
如果觉得本文帮到了你,记得点赞哦,当然也可以请博主喝一杯豆浆
微信二维码 QQ二维码
目录
相关文章
|
6月前
|
JavaScript 前端开发
uVeiw color 颜色值
uVeiw color 颜色值
51 0
同一个UILabel不同的字体颜色
同一个UILabel不同的字体颜色
67 0
UILabel 调整行间距
UILabel 调整行间距
89 0
三种方法设置UITextField的占位文字颜色
三种方法设置UITextField的占位文字颜色
243 0
常用颜色RGB、灰度值、取色值、透明度。
常用颜色RGB、灰度值、取色值、透明度。
635 0
RGB颜色设置错误
RGB颜色设置错误
150 0
|
iOS开发
关于16进制颜色值转换为UIColor的思考
前言 大家都知道iOS的UIColor提供的自定义初始化是通过RGB(A) 4个10进行制的参数,那么为什么用16进制呢?因为web和安卓端以常识性用16进制读取,所以为了方便设计师出图标注,很多时候都是16进制的效果图。
2125 0