3

我正在使用 CALayers 绘制到 UITableViewCell。我试图弄清楚如何根据 UITableViewCell 的内容对图层进行排序。例如:

  1. 我在 cellForRow:atIndexPath 方法中向 UITableViewCell 添加标签
  2. 在 UITableViewCell 的 drawRect 方法中,我使用当前上下文绘制了一些内容
  3. 此外,在 drawRect 我添加了一些子层

那么这些元素的顺序是什么。我知道我在 CALayers 上有 zPosition,但我不确定它们是否总是在 UITableViewCell 的任何子视图之上。而且我不确定在 drawRect 中绘制的内容的顺序。任何帮助或文档链接都会很棒。我已经阅读了核心动画编程指南,但没有看到任何可以回答的地方。

4

2 回答 2

4

CALayers 维护一个层次结构,就像视图一样。子层在它们的超层之前渲染,所有的层次都向上。该zPosition属性只能用于控制兄弟层的渲染,方法是将一个放在另一个之上。即使这样,您最好在sublayers属性中对兄弟图层进行排序(图层按照它们在该数组中的顺序绘制,每个连续的图层都绘制在数组中它之前的图层上)。

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

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

于 2010-03-31T15:11:36.597 回答
3
  1. 您的 UITableViewCell(或派生类)派生自 UIView。它拥有一个 CALayer,您可以通过 layer 属性访问它。该层占据了视图的整个区域。您添加到单元格视图的 UILabel 将是单元格的 UIView 的子级,并且它们的 CALayer 将是单元格的 CALayer 的子级。子图层绘制在其父图层的前面。
  2. 当您在 UIView 的 drawRect 方法中绘制任何内容时,UIView 拥有的 CALayer 将由位图支持。您的 UILabel 将根据它们的大小部分或完全遮盖此位图。
  3. 您稍后添加到单元格层的任何子 CALayers 都将是 UILabel 层的兄弟姐妹,并且由于您稍后添加它们,因此默认情况下它们将被添加到它们下面(尽管添加它们的方法的版本可以控制排序)。

请注意,出于性能原因,不建议在 UITableViewCell 中绘制并同时使用子视图。出于同样的原因,不建议拥有超过 4 个子视图/层。

于 2010-03-31T15:12:08.350 回答