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);
相关推荐
FreeBuf_11 小时前
原子级 macOS 信息窃取程序升级:新增后门实现持久化控制
macos·信息窃取
CHANG_THE_WORLD14 小时前
「macOS 系统字体收集器 (C++17 实现)」
开发语言·c++·macos
Engandend14 小时前
Flutter与iOS混合开发交互
flutter·ios·程序员
小Lu的开源日常15 小时前
在 macOS 上设置 SSH 和 Git
git·macos·ssh
山水域16 小时前
GoogleAdsOnDeviceConversion 库的作用与用法
ios
Lucifer晓16 小时前
记录一次Flutter项目上传App Store Connect出现“Validation failed”错误的问题
flutter·ios
朴拙数科17 小时前
在 macOS 上安装与自定义 Oh My Zsh:让终端美观又高效 [特殊字符]
大数据·elasticsearch·macos
阿里超级工程师17 小时前
经验分享-没有xcode也可以上传App Store Connect
xcode·上传ipa
小Lu的开源日常17 小时前
在 Mac 上使用 iTerm2 和 Oh My Zsh 打造优雅终端
macos·iterm·命令行
扶我起来还能学_18 小时前
uniapp Android&iOS 定位权限检查
android·javascript·ios·前端框架·uni-app