你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS的UIColor類與其相干類之間的差別及斷定相等的辦法

iOS的UIColor類與其相干類之間的差別及斷定相等的辦法

編輯:IOS開發綜合

UIColor,CGColor,CIColor三者的差別和接洽
 
  比來看了看CoreGraphics的器械,看到關於CGColor的器械,因而就想著趁便看看UIColor,CIColor,弄清晰它們之間的差別和接洽。上面我們分離看看它們三個的概念:
 
1、UIColor
 
  UIColor是UIKit中存儲色彩信息的一個主要的類,一個UIColor對象包括了色彩和通明度的值,它的色彩空間曾經針對IOS停止了優化。UIColor包括了一些類辦法用於創立一些最多見的色彩,如白色,黑色,白色,通明色等,這些色彩的顏色空間也不盡雷同(白色和黑色是kCGColorSpaceDeviceGray,白色的顏色空間是kCGColorSpaceDeviceRGB)。
 
  另外UIColor還有兩個主要的屬性:一個是CGColor,一個是CIColor(5.0以後添加)。這兩個屬性便可以把UIColor,CGColor,CIColor三個對象接洽起來了,前面會具體引見這三者之間的轉換。
 
 
 
2、CGColor
 
  CGColor重要用於CoreGaphics框架當中,CGColor實際上是個構造體,而我們平日在應用的CGColor的時刻應用的是它的援用類型CGColorRef。CGColor重要由CGColorSapce和Color Components兩個部門構成,異樣的色彩構成,假如色彩空間分歧的話,解析出來的成果能夠會有所分歧。這就像我們在處置圖片數據的時刻,假如把RGBA格局當做BGRA格局處置的成果可想而知。在Quartz 2D中CGColor經常使用來設置context的填充色彩,設置通明度等。
 
1、若何創立一個CGColor,最經常使用的函數是CGColorCreate,該函數有兩個參數:
 
  1) colorspace,指定CGColor對應的色彩空間,Quartz就會retain該對象,是以挪用完以後你便可以平安的釋放該對象。
 
  2) components,一個CGFloat的數組,該數組的元素個數是指定顏色空間包括的色彩重量數n,加上對應的alpha值。 
 
  該函數該前往一個新創立的CGColorRef,當我們不再應用該對象的時刻應用CGColorRelease函數釋放該對象。
 
2、獲得CGColor的數據
 
  在我們創立的時刻傳入兩個主要的參數出來,當我們獲得到了CGColorRef今後固然便可以拿到對應的ColorSpace和Components。
 
  1) 獲得ColorSpace
 
  經由過程CGColorGetColorSpace函數我們可以獲得到以後CGColorRef對應的ColorSpace,該函數只接收一個參數就是你要獲得ColorSpace的CGColorRef。上面請看一個簡略的例子:

CGColorRef cgColor = [UIColor redColor].CGColor;
CGColorSpaceRef colorSpace = CGColorGetColorSpace(cgColor);
NSLog(@"color space: %@", colorSpace);
  2) 獲得Color Components
 
  要獲得到CGColorRef對應的色彩值,我們須要用到CGColorGetNumberOfComponents和CGColorGetComponents兩個函數。我們先來看看兩個函數的函數原型:
 


size_t CGColorGetNumberOfComponents (
   CGColorRef color
);

const CGFloat * CGColorGetComponents (
   CGColorRef color
);


  第一個函數是取得CGColorRef的中包括的色彩構成部門的個數,第二個函數就是獲得現實的色彩構成部門的數組,上面看一個小例子:

NSUInteger num = CGColorGetNumberOfComponents(cgColor);
const CGFloat *colorComponents = CGColorGetComponents(cgColor);
for (int i = 0; i < num; ++i) {
    NSLog(@"color components %d: %f", i, colorComponents[i]);
}
 
 
3、CIColor
 
  CIColor重要是用於和Core Image框架中其他類,好比CIFilter,CIContext和CIImage。明天我們重要關懷的色彩值部門,CIColor中色彩值的規模是0.0-1.0之間,0.0代表該色彩重量為最小值,1.0代表改色彩重量為最年夜值。個中alpha值的規模也是0.0到1.0之間,0.0代表全通明,1.0代表完整不通明,同時CIColor的色彩重量平日都是沒有乘以alpha值。
 
  我們可使用initWithCGColor:函數,經由過程CGColor創立一個CIColor。個中傳入的CGColorRef對象可使任何任何色彩空間,然則Core Image框架會在傳入filter kernel之前把一切的色彩空間轉換到core image任務色彩空間。core image任務色彩空間應用三個色彩重量加上一個alpha重量構成(其實就是kCGColorSpaceDeviceRGB),前面的例子中我們驗證這一點。
 
 
 
4、UIColor,CGColor,CIColor的差別和接洽
 
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);


  全部進程中,我們經由過程運轉異樣可以發明,當我們用一個CMYK色彩空間的CGColor來初始化CIColor的時刻,CIColor的色彩空間仍然是CMYK,然則色彩值曾經轉換成RGB的色彩值。當應用該CIColor創立一個UIColor的時刻,我們再經由過程CIColor和CGColor屬性打印信息的時刻,我們會發明CIColor的顏色空間仍然是CMYK,然則CGColor打印所獲得的信息解釋它曾經被轉換成RGB空間了。
 
 
 
5、UIColor延長,若何斷定兩個色彩能否相等
 
  後面提到一點,不論UIColor應用CIColor,CGColor照樣其他方法初始化的,其CGColor屬性都是可用的。CoreGraphics中供給一個辦法可以斷定兩個CGColor能否相等,是以我們可以經由過程斷定兩個UIColor能否相等,上面是看一個簡略的例子:
 


// judge two CGColor is equal
if (CGColorEqualToColor([UIColor whiteColor].CGColor, [UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor)) {
    NSLog(@"The two CGColor is equal!");
}
else {
    NSLog(@"The two CGColor is not equal!");
}
   
if (CGColorEqualToColor([UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor, [UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor)) {
    NSLog(@"The two CGColor is equal!");
}
else {
    NSLog(@"The two CGColor is not equal!");
}

例子中第一部門是斷定兩個白色的UIColor能否相等,固然都是白色,然則色彩空間是紛歧樣的,經由過程運轉我們可以發明,打印出“The two CGColor is not equal!”。例子的第二部門簡略的創立了兩個RGB空間的UIColor,運轉法式可以看出,這兩種色彩是雷同的。

斷定兩個UIColor的色彩值能否相等
前兩天有個同伙問我若何斷定兩個色彩的值能否相等,我想只需斷定兩個色彩的RGBA值能否相等不久可以了嘛,因而開端查找贊助文檔找到了UIColor類,很輕易就找到了函數:
 
- (BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha;
如許便可以斷定兩個UIColor對象的色彩能否相等,代碼以下:
 
    enum {  
 enEqual,   
 enNotEaual,   
 enCannotConvert, 
    };
 typedef NSInteger KCompareResult;

 + (KCompareResult) isTheSameColor:(UIColor*)color 
  redValue:(CGFloat)rValue 
  greenValue:(CGFloat)gValue                                                blueValue:(CGFloat)bValue                                       
  alphaValue:(CGFloat)aValue
 {

  if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) { 

   CGFloat redValue, greenValue, blueValue, alphaValue;
   if ([color getRed:&redValue green:&greenValue blue:&blueValue alpha:&alphaValue]) {
    if (redValue == rValue && greenValue == gValue && blueValue == bValue && alphaValue == aValue) {
     return enEqual;
    }
    else {
     return enNotEaual;
    }
   }
   else {          // can not convert  
    return enCannotConvert;
   }
  }
 }

【iOS的UIColor類與其相干類之間的差別及斷定相等的辦法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved