我今天注意到,当我在我的UIView
实例中运行以下代码时,在我的视图中添加了1个CALayer和2个子视图:
[self.layer.sublayers count]
返回3
。这是否意味着子视图也被视为子图层?如果我只想要我在sublayers
电话中画出的CALayers,我该怎么做?
答案 0 :(得分:3)
是的,每个UIView
都有一个基础CALayer
,当视图添加到超级视图时会添加到其超级视图的图层中。
我不知道找到自己的图层的理想方式。由于sublayers
是NSArray
(而不是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及更高版本中可用。
相关示例代码