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);
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM