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);
相关推荐
茶底世界之下3 天前
为什么预览、录制、离线导出不能共享同一个背压策略?
ios·swift
2501_916007473 天前
苹果商店iOS应用上架费用全面解析:开发者计划与审核费用计算
android·ios·小程序·https·uni-app·iphone·webview
2501_916008893 天前
如何实现iOS App代码混淆:SwiftShield使用指南
android·ios·小程序·https·uni-app·iphone·webview
2501_915909063 天前
移动端开发工具链怎么组合比较好,iOS、Android、跨端三套配置方案
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2501_916008893 天前
怎么用 Godot 导出 iOS 应用并上架 App Store?签名字段该填什么?
android·ios·小程序·https·uni-app·iphone·webview
2501_915918414 天前
iOS编程用什么软件好?主流工具Xcode、AppCode、CodeRunner与新兴快蝎对比
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
终端安全笔记4 天前
iOS 27 之后「策略空转」:设备升级不报错,但旧策略不再管它
android·网络·安全·ios·智能手机
9765033354 天前
iOS 上架 4.3a 被拒【uniapp专讲】
flutter·ios·objective-c·uniapp·swift
黑化旺仔5 天前
【OC】KVO
macos·ios·objective-c·cocoa
HouWan5 天前
SwiftUI 小技巧:如何读取 SwiftUI Font 的详细信息
ios·swiftui·apple