CoreGraphics,UIViews和CALayers之间的关系
我总是使用CoreGraphics和CoreAnimation,我明白他们每个人是如何独立工作的,而不是那些需要与另一个人交谈的边缘案例。 我也明白, UIView
是CALayer
一个很好的包装,其中CALayer
完成所有繁重的渲染, UIView
增加了基于触摸的响应。
但是,到目前为止,我所看到的所有问题都是从一方或另一方攻击问题,而不是从它们之间的相互作用,特别是在CoreGraphics和CALayer
之间。
无论如何,我的问题是…
CoreGraphics如何与CALayer相关联?
我的理解是,一个CALayer
包装CoreGraphics方法来绘制自己,但一次,并可以与自己的快照生活,直到失效。 但是,这些绘图方法如何与该图层的子图层相互作用? 他们是独家?
例如,当我有一个具有子视图的UIView
时会发生什么,我重载了drawRect
方法? 这是如何影响其子图层的绘制?
在同一个函数中混合两个是一个好主意吗?
另外, 我只问iOS ,我知道Mac是一个不同的野兽(也有那些奇特的CIFilters
,混蛋!)。
之前的研究
以下是我之前研究过的一些相关问题:
- 关于quartz2d,核心graphics,核心animation,核心图像混淆 。 这个问题要求彼此之间的差异,所select的答案的确提供了答案,但是对于每个单独的图书馆来说,就好像另一个图书馆不存在一样。
- 绘制或不绘制 。 另一个很好的问题,但它只涉及绘制CoreGraphics的主题与UIKit的问题,但无论如何,select的答案提供了部分难题。
- 用自定义CALayeranimation馅饼切片 。 必须是我在这个主题中看到的最有价值的教程之一,这是唯一指导我画CALayer
- CoreGraphics和CoreAnimation之间有什么不同?对提问者接受答案的速度感到绝望,我觉得还有更多的东西在这里。
- 各种WWDCvideo,但我没有看到一个详细解释一般范围。 如果有人用WWDCvideo回复,我会认为这是一个有效的答案。
我会尽量在概念性的20,000英尺水平上回答你的问题。 我会试图在我过分概括的地方放弃我的观点,但是我会试图打破常见的情况。
也许最简单的方法是这样的:在GPU的内存中,为了讨论的目的,纹理是位图图像。 一个CALayer可能有一个纹理相关的,或者它可能不会。 这些情况将分别与具有-drawRect:
方法的图层和仅包含子图层的图层相对应。 从概念上讲,每个具有与之相关联的纹理的图层都有自己的纹理(有一些细节和优化使得这不是严格的/普遍的真实的,但是在一般的抽象的情况下,它可以帮助我们想一想)考虑到这一点,superlayer的-drawRect:
方法对它的-drawRect:
层“ -drawRect:
”方法都没有影响,而且(在一般情况下)子层的-drawRect:
方法对其超级层没有任何影响-drawRect:
方法。 每个绘制到自己的纹理(也称为“后备存储”)中,然后基于图层树和相关的几何graphics和变换,GPU将所有这些纹理合并到屏幕上。 当其中一个图层被直接或间接地(通过-setNeedsDisplayInRect:
无效时,那么当CA去显示屏幕上的下一帧时,无效图层将通过调用-drawRect:
方法重绘。 这将更新相关的纹理,一旦所有的无效层纹理更新,GPU将它们合成,生成您在屏幕上看到的最终位图。
所以要回答你的第一个问题:在一般情况下,不,在不同的CALayers的-drawRect:
方法之间没有相互作用。
至于你的第二个问题:为了这个讨论的目的,你可以把UIViews和CALayers一样。 在绘图和纹理方面的相互关系在很大程度上与非UIView CALayers的相互关系没有变化。
对你的第三个问题:混合UIViews和CALayers是个好主意吗? 每个UIView都有一个CALayer支持它(UIKit中的所有视图都是层次支持的,在OSX上通常不是这种情况)。所以在某种程度上,它们是“混合”的,无论你是否希望它们是。 将CALayer子层添加到支持UIView的层上是完全正确的,尽pipe该层不会具有UIView带给聚会的所有附加function。 如果该图层的目的只是生成一个图像来显示,那就没问题了。 如果你想让子层/视图成为触摸处理中的第一类参与者,或者使用AutoLayout进行定位/定位,那么它将需要成为一个UIView。 可能最好把UIView看作一个CALayer,附加一些额外的function。 如果您需要该function,请使用UIView。 如果不这样做,请使用CALayer。
总之:CoreGraphics是绘制2Dgraphics的API。 CG(但不是唯一的)的一个常见用途是绘制位图图像。 CoreAnimation是一个API,提供了一个有组织的框架来处理屏幕上的位图。 例如,如果您的所有纹理都由在编译时编译到您的应用程序中的图像支持,您可以有意义地使用CoreAnimation,而无需调用CoreGraphics绘图基元。
希望这是有帮助的。 如果您需要澄清,留下意见,我会编辑为义务。