在根CALayer的子图层中计算的子视图?

时间:2010-07-15 10:22:47

标签: objective-c uikit uiview calayer

我今天注意到,当我在我的UIView实例中运行以下代码时,在我的视图中添加了1个CALayer和2个子视图:

[self.layer.sublayers count]

返回3。这是否意味着子视图也被视为子图层?如果我只想要我在sublayers电话中画出的CALayers,我该怎么做?

3 个答案:

答案 0 :(得分:3)

是的,每个UIView都有一个基础CALayer,当视图添加到超级视图时会添加到其超级视图的图层中。

我不知道找到自己的图层的理想方式。由于sublayersNSArray(而不是NSSet),这意味着它是一个有序列表,这意味着您可以确定向superview添加视图的顺序是它们将出现在所述数组中的顺序相同。

因此,如果您先添加UIViews,然后再添加自己绘制的CALayers,则可以通过访问sublayers中索引2(跳过0和1)开始的对象来获取自己的。

当然,如果您随后向superview添加或删除视图,则必须修改此值,因此假设这实际上有效,您将需要以某种方式动态生成它。

您可以使用indexOfObject:属性上的sublayers在添加图层时确定图层的索引。更安全的路线可能只是将此索引存储在列表中的某个位置,并仅使用该列表中的索引访问子层。

答案 1 :(得分:1)

  

如果我只想要我在子图层中绘制的CALayers,   我该怎么做?

您可以通过将当前为self子视图的视图放入同级视图中,使它们都成为包含视图的子视图。然后,您当前的self.layer.sublayers将只包含您手动添加的CALayers。

考虑它的一种方法是是层次结构,而不是视图层次结构,它定义了渲染层次结构。视图层次结构只是处理UIView添加到其底层CALayer图形的交互性的包装器。因此,当您向视图添加子视图时,它同时(尽管在某种意义上是独立的)将其图层作为子图层添加到视图的图层中。您可以在UIView ...

上的子类或类别中覆盖此功能

答案 2 :(得分:1)

来自CALayer文档:

  

<强>委托

     

指定接收者的委托对象。

     

@property(assign)id delegate

     

<强>讨论

     

在iOS中,如果图层与UIView对象相关联,则必须将此属性设置为拥有图层的视图。

     

<强>状况

     

在OS X v10.5及更高版本中可用。

     

相关示例代码