首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CALayer & drawRect

CALayer & drawRect
EN

Stack Overflow用户
提问于 2013-04-12 08:10:38
回答 3查看 7.6K关注 0票数 7

视图与窗口体系结构中,引用:

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

在“视图绘制周期”一节中进一步指出:

UIView类使用随需应变的绘图模型来表示内容。当一个视图第一次出现在屏幕上时,系统要求它绘制它的内容。系统捕获此内容的快照,并使用该快照作为视图的可视表示形式。

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

如果不是,该内容快照“驻留”在哪里?

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

附注:

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

我只想了解ios视图层的架构。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-12 08:26:11

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

是。所有的东西都是在引擎盖下分层的。UIView的-drawRect将捕获您所绘制的内容,并(据我所知)在视图的子层上设置content。它甚至可以在主层对象上这样做。这就是保存“快照”的地方。

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

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

尽管如此,您确实需要意识到,每个层最终将成为一个单独的GPU“元素”,因此减少所拥有的层数或使用父层的shouldRasterize+rasterizationScale属性可以带来性能好处。这将获取整个层层次结构的快照,并创建要呈现的单个光栅化图像,而不是n个单独的图像。

票数 11
EN

Stack Overflow用户

发布于 2013-04-12 08:18:33

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

两个字:“实施细节”

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

不完全同意。层非常擅长动画内容(正如框架名称核心动画所暗示的那样)。drawRect对高级绘图很好,但是可以缓慢地重新绘制每一个帧(显然取决于您正在绘制的是什么)。

我在你的问题中没有看到提到过核心动画编程指南。这是一个很好的地方来了解更多关于图层部分的视图。

票数 1
EN

Stack Overflow用户

发布于 2013-04-12 08:29:37

每个UIView都有一个底层的CALayer (这就是在屏幕上呈现的内容)。

CALayer只是位图(保存像素)。当您对视图调用setNeedsDisplay时,CALayer会被标记为重绘。在run循环的末尾,在处理事件之后,将创建一个CGContextRef并调用drawRect委托。然后,将内容绘制到创建的上下文中,然后将其复制到位图中,并最终与屏幕上显示的其他层进行组合。

所以是的,“快照”存储在CALayer中。这只是一个优化,这样层就不必重新绘制自己,除非它们被标记为被重绘(用setNeedsDisplay)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15966219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档