UIView 和 CALayer的区别

UIView和CALayer在iOS开发中分别负责用户交互和内容显示。UIView封装了CALayer,处理交互事件,而CALayer属于QuartzCore框架,用于跨平台的图形绘制。苹果使用CALayer进行统一的绘制工作,但根据iOS和macOS的交互差异,分别用UIResponder和NSView处理事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总的来说:  每个UIView都封装了一个CALayer,UIView负责处理用户交互,负责绘制内容的则是它持有的那个CALayer,我们访问和设置UIView的这些负责显示的属性实际上访问和设置的都是这个CALayer对应的属性,UIView只是将这些操作封装起来了而已。

形象理解就是UIView就像电视机,CALayer则是它的屏幕,对于观众来讲我们知道电视机能显示东西、能操作(开关机、换台等)、能设置和获取各种显示属性,比如亮度、对比度等。我们对电视机的各种命令都会改变它自身的显示,就像我们修改一个UIView的背景色一样,电视机本身把如何显示的细节隐藏起来了,观众只需要简单的按个按钮(给UIView设置一个属性)就能控制它的显示了。当我们获取和设置电视机当前的亮度时,电视机只是简单的去获取和设置它的显示屏的亮度而已。我们访问和设置UIView的一些负责绘制规则的属性比如frame、center、backgroundColor等,在其持有的CALayer中都存在对应的属性,UIView只是简单的返回它自己CALayer的属性以及对自己的CALayer的这些对应的属性赋值而已。

具体的,CALayer是负责显示内容的、与图形显示有关的类,其属于QuartzCore框架,这个框架是一个跨平台的绘制框架,而UIView类本身没有显示图形的功能,但它有一个CALayer类属性层,UIView实例通过管理自己的层来显示内容.
layer的delegate类就是创建layer的UIView实例,UIView类实现了CALayerDelegate协议来为自己的layer提供图像内容。同时,UIView类继承自UIResponder类,所以可以交互交互事情做出反应。

这里的跨平台指的是在iOS和macOS系统上均能使用,也就是说CALayer能在iOS和macOS上面绘制内容(这也说明了为什么CALayer的很多属性都不是UIKit框架下面的东西,比如它的backgroundColor是CGColorRef,因为macOS中没有UIKit)。但是这两个平台接收用户交互的方式完全不一样:iOS是通过触摸事件(touch event)而macOS则是监听鼠标和键盘事件。

苹果的工程师们考虑到:这两个平台的绘制规则(如何将一个像素显示到屏幕上)都是一样的,但是交互规则完全不一样。所以他们使用了同一种绘制方式和不同的交互方式,具体的,他们将CALayer作为两个平台共同的用来绘制内容的类而针对交互方式,他们在iOS中使用了UIResponder类来响应交互在macOS中则没有UIKit里面的类取而代之是叫做NSView之类的东西。而通常情况下交互是发生在绘制内容之上的(有内容的地方才能点击),所以UIKit将CALayer封装进了UIView中,让开发者们感觉到UIView既能绘制又能处理交互,而实际上负责绘制的是UIView中的CALayer

iOS CoreAnimation专题——原理篇(一) CALayer与UIView之间的关系 - 知乎

UIView与CALayer的关系 - zkk的博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值