• 判断两个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

  • 相关阅读:
    es基本使用之查询数据
    python 时间格式转换
    Linux 使用scp命令定时将文件备份到另一台服务器
    Scrapy项目运行和debug断点调试
    Day042.绘制9个同心圆
    Day041.画蟒蛇-用函数来封装
    Day040.画蟒蛇-不加库前缀
    Day039.画蟒蛇
    Day038.用函数来进行温度转换
    Day037.带循环的温度转换
  • 原文地址:https://www.cnblogs.com/smileEvday/p/2285275.html
Copyright © 2020-2023  润新知