iPhone CALayer堆叠订单

时间:2010-03-31 14:17:34

标签: iphone core-animation core-graphics calayer drawrect

我正在使用CALayers绘制到UITableViewCell。我正在试图弄清楚层是如何与UITableViewCell的内容一起排序的。例如:

  1. 我在cellForRow中添加标签到UITableViewCell:atIndexPath方法
  2. 在UITableViewCell的drawRect方法中,我使用当前上下文
  3. 绘制一些内容
  4. 另外,在drawRect中我添加了一些子图层
  5. 那么这些元素的顺序是什么。我知道我在CALayers上有zPosition,但我不确定它们是否总是位于UITableViewCell的任何子视图之上。而且我不确定drawRect中绘制的内容在哪里出现。任何帮助或文档链接都会很棒。我已经阅读了核心动画编程指南,并没有看到任何可以回答它的地方。

2 个答案:

答案 0 :(得分:4)

CALayers维护层次结构,就像视图一样。子层在其超级层前面渲染,层次结构都在层次结构中。 zPosition属性应仅用于通过将兄弟图层放在另一个图层上方来控制兄弟图层的渲染。即便如此,您最好在sublayers属性中对兄弟图层进行排序(图层按照它们在该数组中的顺序进行绘制,每个连续图层都在数组之前的图层上绘制)。

很容易看到这个层次结构,因为当你在代码中创建子层时,你手动将子层添加到层中,一直回到UITableViewCell的后备层(层支持的UIView的子类)。

顺便说一下,你真的不应该在你的-drawRect:方法中为你的UITableViewCell添加图层。这应该只用于绘制UITableViewCell基础层的内容。在此方法中分配和设置CALayers可能会导致滚动或重绘时显着减慢。您应该只需要在初始化UITableViewCell时在某个时刻设置这些图层,然后只需在重复使用该单元时更新它们。

答案 1 :(得分:3)

  1. 您的UITableViewCell(或派生类)派生自UIView。它拥有一个CALayer,您可以通过图层属性访问它。该图层占据视图的整个区域。您添加到单元格视图中的UILabel将成为单元格UIView的子项,其CALayer将成为单元格CALayer的子项。儿童图层是在父母面前绘制的。
  2. 当您在UIView的drawRect方法中绘制任何内容时,UIView拥有的CALayer将由位图支持。你的UILabel会根据它们的大小部分或完全模糊这个位图。
  3. 您之后添加到单元格层的任何子CALayers都将成为UILabel图层的兄弟姐妹,并且由于您稍后添加它们,默认情况下会添加它们(有些版本可以添加它们来控制排序)
  4. 请注意,出于性能原因,不建议在UITableViewCell中绘图并同时使用子视图。出于同样的原因,不建议使用4个以上的子视图/图层。