ios – CALayer&drawRect

View and Window Architecture声明,引用:

视图与核心动画层结合使用,以处理视图内容的渲染和动画. UIKit中的每个视图都由一个图层对象(通常是CALayer类的一个实例)支持,该图层对象管理视图的后备存储并处理与视图相关的动画.

在“视图绘制周期”部分中进一步说明:

UIView类使用按需绘图模型来呈现内容.当视图首次出现在屏幕上时,系统会要求其绘制其内容.系统捕获此内容的快照,并将该快照用作视图的可视化表示.

这是否意味着,在其drawRect方法调用中的视图中绘制的内容是在保存在其后备核心动画层中的快照中捕获的?

如果没有,这个内容快照“驻留”在哪里?

如果没有,这是否意味着CALayer用于呈现“静态”内容,内容不会经常变化,而drawRect用于呈现经常更改的内容,例如在游戏应用中?

附:

这些问题与任何特定的代码实现无关.

我只是想了解ios视图层架构.

解决方法

Does that mean,that the content drawn in a view in its drawRect method call,is captured in a snapshot in saved in its backing core animation layer?

是.一切都使用引擎盖下的层. UIView的-drawRect将捕获您绘制的内容,并且(据我所知)在视图的子层上设置内容.它甚至可能在主层对象上执行此操作.这就是保存“快照”的地方.

If not,does that mean that CALayer is used to render “static” content,
content that doesn’t change very often,and drawRect is used to render
content that changes often,for example in a game app?

内容更改的频率并不会影响选择.使用drawRect与手动创建CALayers没有太大区别.这取决于您希望如何组织视图中的子元素,或者是否要创建低级可重用层对象而没有UIView的详细信息(例如CATextLayer).如果要绘制各种不同的子元素,则可以使用自己的自定义绘图代码将它们拆分为不同的图层.如果您只需绘制一个简单的内容,则可以在一个drawRect实现中完成所有操作.

说完这些之后,您需要注意每个层最终都会成为一个单独的GPU“元素”,因此减少层数或使用父层的shouldRasterize rasterizationScale属性可以带来性能优势.这将拍摄整个图层层次结构的快照,并创建要渲染的单个栅格化图像,而不是n个单独的图像.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...