2010-07-15 50 views
2

今天我注意到,加入1个CALayer的2子视图我的看法的时候,当我在UIView实例中运行下面的代码:在根CALayer的子图层中计数的子视图?

[self.layer.sublayers count] 

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

+0

我不熟悉与层中使用的层次,但我没有写一个[功能登录的意见层级(http://stackoverflow.com/questions/2715534 /在那里,确实-A-UIAlertView中,活而 - 不解雇/ 2715772#2715772)。您可以修改此代码以记录图层树。了解视图和图层如何嵌套可以帮助您了解它如何更好地工作。 – progrmr 2010-07-15 15:11:55

回答

3

是的,每个UIView都有一个潜在的CALayer当视图添加到超级视图时,它被添加到它的超级视图的图层。

我不知道只找到自己的图层的理想方法。由于sublayersNSArray(而不是一个NSSet),这意味着它是一个有序的列表,这意味着你可以肯定的是,在其中添加欣赏到上海华顺序是它们将出现在所述阵列中的顺序相同。因此,如果您先添加您的UIViews,然后添加您自己的绘制CALayers,则可以通过访问sublayers中索引2(跳过0和1)开始的对象来获得自己的属性。

当然,如果你再添加或删除意见,以上海华你必须修改这个值,所以这个假设的实际工作,你会希望以某种方式动态生成它。

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

1

如果我只想要在我的sublayers中调用的CALayers, 我该怎么做?

您可以通过将当前子视图self的子视图设置为兄弟视图来做到这一点,因为它们都是包含视图的子视图。然后你目前的self.layer.sublayers只包含你手动添加的CALayers。想一想

一种方法是,它是层层次结构中,不是视图层次限定渲染层次结构。视图层次结构只是处理UIView添加到其底层CALayer图形的交互性的包装器。因此,当你将一个子视图添加到一个视图时,虽然在某种意义上独立地将它的图层作为子图层添加到视图的图层中。你很可能会覆盖在UIView的一个子类或类此功能...

1

从CALayer的文档:

代表

指定接收方的委托对象。

@property(分配)ID代表

讨论

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

状况

可在OS X v10.5及其以后。

相关示例代码