Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone CALayer堆叠顺序_Iphone_Core Animation_Core Graphics_Calayer_Drawrect - Fatal编程技术网

iPhone CALayer堆叠顺序

iPhone CALayer堆叠顺序,iphone,core-animation,core-graphics,calayer,drawrect,Iphone,Core Animation,Core Graphics,Calayer,Drawrect,我正在使用CALayers绘制一个UITableViewCell。我试图弄清楚层是如何按照UITableViewCell的内容排序的。例如: 我将标签添加到cellForRow:atIndexPath方法中的UITableViewCell 在UITableViewCell的drawRect方法中,我使用当前上下文绘制了一些内容 另外,在drawRect中,我添加了一些子层 那么这些元素的顺序是什么呢。我知道我在CALayers上有zPosition,但我不确定它们是否总是位于UITableVie

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

  • 我将标签添加到cellForRow:atIndexPath方法中的UITableViewCell
  • 在UITableViewCell的drawRect方法中,我使用当前上下文绘制了一些内容
  • 另外,在drawRect中,我添加了一些子层

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

    CALayers维护一个层次结构,就像视图一样。子层在其超层前面渲染,所有子层都位于层次的上方。
    zPosition
    属性只能用于通过将一个层置于另一个层之上来控制同级层的渲染。即使如此,最好在
    子层
    属性中对同级层进行排序(层按照其在该数组中的顺序绘制,每个连续层都绘制在数组中其前面的层上)

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

    另外,您确实不应该在UITableViewCell的
    -drawRect:
    方法中添加层。仅用于绘制UITableViewCell基础层的内容。在此方法中分配和设置Calayer可能会导致滚动或重画时显著减速。当UITableViewCell初始化时,您应该只需要在某个点设置这些层一次,然后在重用该单元时简单地更新它们

  • UITableViewCell(或派生类)派生自UIView。它拥有一个CALayer,您可以通过layer属性访问该CALayer。该层占据了视图的整个区域。添加到单元格视图的UILabel将是单元格UIView的子项,其CALayer将是单元格CALayer的子项。子层在其父层前面绘制
  • 在UIView的drawRect方法中绘制任何内容时,UIView拥有的CALayer将由位图支持。UILabel将部分或完全隐藏此位图,具体取决于它们的大小
  • 您稍后添加到单元格层的任何子Calayer都将是UILabel层的同级,并且由于您稍后添加了这些子Calayer,因此默认情况下它们将添加到这些子Calayer下(尽管有添加这些子Calayer的方法版本可以控制排序)

  • 请注意,出于性能原因,不建议同时在UITableViewCell中绘制和使用子视图。出于同样的原因,不建议使用4个以上的子视图/层。

    那么可见性的顺序将是-从下到上:UITableViewCell背景位图-UITableViewCell.layer-UILabel背景位图-UILabel.layer?如果这是真的,那么UILabel.layer是UITableViewCell.layer的一个子层?我很好奇在哪里建立我的层层次结构?UITableViewController是否可以将子层添加到UITableViewCell.layer?我有两个图层,一个是用CGGradient绘制的单元格背景,另一个是显示在UITableViewCell上方的图层。从U62的答案来看,我应该在单元格上画梯度。我以前这样做过,但因为听到层缓存,所以将其更改为层。上面的渐变是半透明的,看起来像光泽,但是滚动是不稳定的。我忘了-我也尝试过绘制渐变并将其作为CGImage存储到layer.contents。但当我在仪器中运行核心动画时,它显示渐变仍在混合颜色。-谢谢您的帮助。@Brian:图层确实可以缓存,但您的视图是以图层为基础的。如果不是每次重用“表视图”单元时都重新绘制渐变,则如果只是在石英背景视图上绘制渐变,则不会重新绘制渐变。但是,如果您正在寻找高性能的渐变实现,您可能需要查看Matt Gallagher的CAGradientLayer示例:@Brian:如果您有多个层,那么当屏幕上出现动画时,它们将在GPU上合成,这就是为什么苹果建议将视图或层次结构展平,以平滑滚动。我相信他们为此提供了一个示例应用程序。