iOS——UIColor与CGColor与CALayer

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对象。例子如下:

objectivec 复制代码
// 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);
相关推荐
夏幻灵4 小时前
HTTPS全面解析:原理、加密机制与证书体
ios·iphone
TheNextByte18 小时前
如何在iPhone上恢复已删除的笔记的综合指南
笔记·ios·iphone
June bug10 小时前
【领域知识】广告全链路测试
macos·objective-c·cocoa
rose and war10 小时前
python和jinja版本问题导致的访问报500
python·ios
fendoudexiaoniao_ios10 小时前
iOS 列表拖拽cell排序
ios·swift
风栖柳白杨10 小时前
【语音识别】Qwen3-ASR原理及部署
人工智能·python·语音识别·xcode·audiolm
2501_9151063211 小时前
当 Perfdog 开始收费之后,我重新整理了一替代方案
android·ios·小程序·https·uni-app·iphone·webview
作孽就得先起床11 小时前
Xcode设置中文
macos
smileSunshineMan12 小时前
本地mac-openclaw安装
macos·openclaw
2501_9159184113 小时前
中小团队发布,跨平台 iOS 上架,证书、描述文件创建管理,测试分发一体化方案
android·ios·小程序·https·uni-app·iphone·webview