zoukankan      html  css  js  c++  java
  • UIColor的用法

    UIColor,CGColor,CIColor的区别和联系

    layer.shadowColor = [UIColor redColor].CGColor;

    这个是今天用到的。顺便总结一下。 

    1、UIColor的两个属性CGColor,CIColor

      UIColor的CGColor总是有效的,不管它是通过CGColor,CIColor,还是其他方法创建的,CGColor属性都总是有效的;但是CIColor属性就不总是有效的,只有当UIColor是通过CIColor创建的时候,他才是有效的,否则访问该属性将会抛出异常,下面照旧来一个小例子:

    复制代码
    // test init uicolor with CGColor
    UIColor *color = [UIColor colorWithCGColor:[UIColor whiteColor].CGColor];
        
    // CGColor property is always valid
    NSLog(@"CGColor from UIColor %@", color.CGColor);
    
    // don't use CIColor property 
    // This property throws an exception if the color object was not initialized with a Core Image color. 
    NSLog(@"CIColor from UIColor %@", color.CIColor);   // crush
    复制代码

    2、UIColor使用CGColor初始化

      当UIColor使用CGColor初始化的时候,所有CGColorRef包含的信息,都会被原封不动的保留,其中就包括Color space,而且通过下面的小例子我们还可以看到如果使用CGColor初始化UIColor的时候,UIColor其实是直接保留了一份这个CGColorRef对象。例子如下:

    复制代码
    // test kCGColorSpaceDeviceCMYK
    CGColorSpaceRef cmykSpace = CGColorSpaceCreateDeviceCMYK();
    CGFloat cmykValue[] = {1, 1, 0, 0, 1};      // blue
    CGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue);
    CGColorSpaceRelease(cmykSpace);
    NSLog(@"colorCMYK: %@", colorCMYK);
        
    // color with CGColor, uicolor will just retain it
    UIColor *color = [UIColor colorWithCGColor:colorCMYK];
    NSLog(@"CGColor from UIColor: %@", color.CGColor);
    复制代码

    3、UIColor使用CIColor初始化

      下面我们讨论一下当使用CIColor来初始化一个UIColor的时候,再去访问UIColor的CGColor属性的时候,我们会发现CGColor的color Space和设置CIColor的color space的是不完全一样的,在这个过程中CIColor会为我们做一个转换。下面我们分别看看使用kCGColorSpaceDeviceGray,kCGColorSpaceDeviceRGB,kCGColorSpaceDeviceCMYK三种颜色空间来初始化一个CIColor的时候,再去使用该CIColor去初始化一个UIColor,然后在去访问其CIColor属,CGColor属性,查看颜色空间并打印颜色信息。

      1) 使用kCGColorSpaceDeviceGray初始化CIColor

      首先看代码:

    复制代码
     // test kCGColorSpaceDeviceGray
    NSLog(@"CGColor white color:%@", [UIColor whiteColor].CGColor);
    
    CIColor *ciColor = [CIColor colorWithCGColor:[UIColor whiteColor].CGColor];
    NSLog(@"cicolor: %@", ciColor);
    NSLog(@"cicolor colorspace: %@", ciColor.colorSpace);
        
    color = [UIColor colorWithCIColor:ciColor];
    NSLog(@"color %@", color);
        
    // Core Image converts all color spaces to the Core Image working color 
    // space before it passes the color space to the filter kernel.
    // kCGColorSpaceDeviceGray ---> kCGColorSpaceDeviceRGB
    NSLog(@"cicolor from UIColor: %@", color.CIColor);
    NSLog(@"cicolor's colorspace: %@", color.CIColor.colorSpace);
    NSLog(@"color's CGColor: %@", color.CGColor);
    复制代码

      通过运行程序,我们看出来,如果使用一个kCGColorSpaceDeviceGray的颜色空间的CGColor来初始化CIColor的时候,我们可以看到CIColor的色彩空间一直是kCGColorSpaceDeviceGray,通过访问UIColor的CIColor属性,我们可以看到其颜色空间仍然是kCGColorSpaceDeviceGray,但是当访问UIColor的CGColor属性的时候,通过打印可以发现其色彩空间已经转变成了kCGColorSpaceDeviceRGB空间了,而颜色值也正确的从原来的颜色空间转换到了新的颜色空间。

      2) 使用kCGColorSpaceDeviceRGB初始化CIColor

      同样的我们看代码:

    复制代码
     //test kCGColorSpaceDeviceRGB
    NSLog(@"CGColor red color:%@", [UIColor redColor].CGColor);
        
    CIColor *ciColor = [CIColor colorWithCGColor:[UIColor redColor].CGColor];
    NSLog(@"cicolor: %@", ciColor);
    NSLog(@"cicolor colorspace: %@", ciColor.colorSpace);
        
    UIColor *color = [UIColor colorWithCIColor:ciColor];
    NSLog(@"color %@", color);
        
    NSLog(@"cicolor from UIColor: %@", color.CIColor);
    NSLog(@"cicolor's colorspace: %@", color.CIColor.colorSpace);
    NSLog(@"color's CGColor: %@", color.CGColor);
    复制代码

      整个过程中CIColor,以及通过UIColor的CGColor和CIColor属性访问到的值,打印出来我们可以发现它们都是kCGColorSpaceDeviceRGB空间的。

    4、使用kCGColorSpaceDeviceCMYK初始化CIColor

      下面继续看一段代码:

    复制代码
    // test kCGColorSpaceDeviceCMYK
    CGColorSpaceRef cmykSpace = CGColorSpaceCreateDeviceCMYK();
    NSLog(@"Components number: %zu", CGColorSpaceGetNumberOfComponents(cmykSpace));
    CGFloat cmykValue[] = {1, 1, 0, 0, 1};      // blue
    CGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue);
    CGColorSpaceRelease(cmykSpace);
    NSLog(@"colorCMYK: %@", colorCMYK);
        
    ciColor = [CIColor colorWithCGColor:colorCMYK];
    NSLog(@"cicolor: %@", ciColor);     // in fact,the color value of CIColor has converted to RGB Colorspace
    NSLog(@"cicolor colorspace: %@", ciColor.colorSpace);
        
    color = [UIColor colorWithCIColor:ciColor];
    NSLog(@"UIColor with CIColor: %@", color);
        
    NSLog(@"cicolor from UIColor: %@", color.CIColor);
    NSLog(@"cicolor's colorspace: %@", color.CIColor.colorSpace);
        
    // when UIColor init with CIColor, UIColor's CGColor will convert other colorspace to kCGColorSpaceDeviceRGB
    NSLog(@"cgcolor from UIColor: %@", color.CGColor);
    复制代码
  • 相关阅读:
    html5 Canvas画图3:1px线条模糊问题
    移动端适配
    JSON数据转换方法 parse()和stringify()
    原生的强大DOM选择器querySelector
    正则去空格方法
    HTML5开发手机应用--viewport的作用
    编译原理的认识与感悟
    CSS实例:图片导航块
    导航,头部,CSS基础
    web基础,用html元素制作web页面
  • 原文地址:https://www.cnblogs.com/wcLT/p/4105755.html
Copyright © 2011-2022 走看看