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 blackColorCGColor];这样的语句,直接使用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);
相关推荐
Privasa-隐私实验室27 分钟前
跨端技术选型|Flutter搭建隐私加密App,安卓与iOS双端差异适配实战
android·笔记·安全·flutter·ios·隐私安全·aes-256
sakiko_15 小时前
OC基础语法(与Swift对比)-1
开发语言·ios·objective-c·swift
未来猫咪花15 小时前
Everything is ViewModel:让状态管理回到对象世界
android·flutter·ios
Crazy_MT16 小时前
不越狱,iPhone 为什么也能安装任意 IPA?聊聊 iLoader、SideStore 和 LiveContainer 的原理
ios·开源
kingbal20 小时前
MAC:chatgpt登陆报错签名异常
macos·chatgpt
k4m7v2pz20 小时前
macOS 窗口最小化:三种写法的实测对比与可复用脚本
macos·窗口管理·截屏·applescript·bevy·ai自动化
JoyCong19981 天前
从iPhone Ultra到ToDesk:折叠大屏时代的效率革命,硬件只是开始
大数据·运维·ios·智能手机·iphone·远程工作·远程操作
2501_916007471 天前
Flutter与游戏App加固避坑指南:如何为混合开发与高交互应用选对安全方案?
安全·flutter·游戏·ios·小程序·uni-app·iphone
2501_916008891 天前
Flutter 开发 iOS,项目打包成 IPA,命令与免 Xcode两种方法
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程