UIColor和CGColor的区别

UIColor和CGColor都是iOS中用于表示颜色的数据类型。

  • UIColor是一个表示颜色的Objective-C类,可以通过调用其构造函数或者通过调用系统提供的颜色选择器来创建一个UIColor对象。UIColor还有两个重要属性:一个是CGColor,一个是CIColor
  • CGColor是一个表示颜色的C数据类型,它是一个结构体,通常用于OpenGL ES和Core Graphics等底层图形库中。CGColor可以通过调用CGColorCreate函数来创建。我们通常在使用的CGColor的时候使用的是它的引用类型CGColorRef。

虽然UIColor和CGColor都可以表示颜色,但它们的使用场景和方式略有不同。通常情况下,如果需要在应用程序中表示颜色,建议使用UIColor,因为它提供了更友好的API和更多的功能。如果需要在底层图形库中表示颜色,建议使用CGColor。

UIView之所以可以显示在屏幕上,是因为它内部的一个图层。在创建UIView的时候,它内部会自动创建一个图层(即CALayer对象),通过UIView 的layer属性可以访问这个层。当UIView需要显示到屏幕上的时候,会调用drawRect:方法进行绘图,并且会将所有内容绘制到自己的图层上,绘图完成后系统会将图层拷贝到屏幕上。换句话说就是UIView本身不具有显示的功能,是它内部的层实现的显示功能,因此,通过操作CALayer对象,可以很方便的调整UIView的一些外观属性

在之前写一个项目的时候,我发现当对一个控件的layer属性进行添加颜色操作的时候,不能直接使用UIColor,而是要使用类似于[[UIColor blackColor]CGColor];这样的语句,直接使用UIColor会报错。通过查看文档我们可以得知如下:

CALayer的技术水平比UIButton低,这意味着它不理解UIColor是什么。UIButton知道UIColor是什么因为它们都在相同的技术水平,但是CALayer在UIButton之下,所以UIColor是一个谜。

而CGColor存在于较底层的CoreGraphics框架中,因此它可以被CALayer理解。
(CoreGraphics框架是可以跨平台使用的,UIKit框架相对较高,UIKit框架仅限于iOS)

UIColor使用CGColor初始化

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

// test kCGColorSpaceDeviceCMYKCGColorSpaceRef cmykSpace = CGColorSpaceCreateDeviceCMYK();CGFloat cmykValue[] = {1, 1, 0, 0, 1};// blueCGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue);CGColorSpaceRelease(cmykSpace);NSLog(@"colorCMYK: %@", colorCMYK);// color with CGColor, uicolor will just retain itUIColor *color = [UIColor colorWithCGColor:colorCMYK];NSLog(@"CGColor from UIColor: %@", color.CGColor);