iOS中建立图层层次结构
在大多数情况下,在应用中使用图层的最佳方法是将其与视图对象结合使用。但是,有时您可能需要通过向其添加其他图层对象来增强视图层次结构。这样做可能会使用Use图层,以提供更好的性能,或者使您实现仅使用视图很难实现的功能。在这种情况下,您需要了解如何管理您创建的图层层次结构。
将图层排列为图层层次结构
图层层次结构在许多方面类似于查看层次结构。您将一层嵌入另一层中,以在要嵌入的层(称为sublayer)和父层(称为superlayer)之间创建父子关系。这种亲子关系影响子层的各个方面。例如,其内容位于其父对象的内容之上,其位置是相对于其父对象的坐标系指定的,并且它会受到应用于父对象的任何变换的影响。
添加,插入和删除子层
每个图层对象都有添加,插入和删除子图层的方法。表4-1总结了这些方法及其行为。

处理自己创建的图层对象时,可以使用上述方法。您不会使用这些方法来排列属于层支持视图的层。但是,层支持的视图可以用作您自己创建的独立层的父级。
定位和调整子层大小
添加和插入子层时,必须先设置子层的大小和位置,然后该子层才会出现在屏幕上。在将子图层添加到图层层次结构后,可以修改其大小和位置,但是在创建图层时应该养成设置这些值的习惯。
您可以使用bounds属性设置子层的大小,并使用属性设置子层在其上层中的位置position。边界矩形的原点几乎总是(0,0),其大小是您想要的以磅为单位指定的图层的大小。position属性中的值是相对于图层的锚点解释的,默认情况下,该锚点位于图层的中心。如果不为这些属性分配值,则Core Animation会将图层的初始宽度和高度设置为0,并将位置设置为(0,0)。
myLayer.bounds = CGRectMake(0,0,100,100);
myLayer.position = CGPointMake(200,200);
重要说明: 始终对图层的宽度和高度使用整数。
图层层次如何影响动画
某些超级图层属性可能会影响应用于其子图层的任何动画的行为。这样的属性之一就是speed属性,它是动画速度的乘数。此属性的值1.0默认设置为,但将其更改为2.0会使动画以其原始速度的两倍运行,从而完成一半的时间。此属性不仅会影响为其设置该图层的图层,还会影响该图层的子图层。这样的变化也是成倍增加的。如果子层及其上层的速度均为2.0,则子层上的动画将以其原始速度的四倍运行。
其他大多数层更改都会以可预测的方式影响任何包含的子层。例如,将旋转变换应用于图层会旋转该图层及其所有子图层。同样,更改图层的不透明度会更改其子图层的不透明度。更改图层大小时,请遵循“ 调整图层层次结构的布局”中介绍的布局规则
调整图层层次结构的布局
Core Animation支持多种选项,可根据子图层的更改来调整子图层的大小和位置。在iOS中,普遍使用基于图层的视图使创建图层层次结构的重要性降低。仅支持手动布局更新
子层和裁剪
与视图不同,超级图层不会自动裁剪位于其边界矩形之外的子图层的内容。相反,默认情况下,超层允许其子层完整显示。但是,您可以通过将masksToBounds图层的属性设置为来重新启用裁剪YES。
图层的剪切蒙版的形状包括图层的角半径(如果已指定)。图4-3显示了一个图层,该图层演示了该masksToBounds属性如何影响带有圆角的图层。如果将该属性设置为NO,则子图层将完整显示,即使它们超出其父图层的范围也是如此。将属性更改为YES会导致其内容被裁剪。
图4-3将 子层裁剪到父级的边界

在图层之间转换坐标值
有时,您可能需要将一层中的坐标值转换为另一层中相同屏幕位置的坐标值。本CALayer类提供了一组可用于此目的的简单转换例程:
除了转换点和矩形值外,还可以使用convertTime:fromLayer:和convertTime:toLayer:方法在图层之间转换时间值。每一层都定义自己的本地时间空间,并使用该时间空间将动画的开始和结束与系统的其余部分同步。这些时间空间默认情况下是同步的。但是,如果您更改一组图层的动画速度,则这些图层的时间空间会相应更改。您可以使用时间转换方法来说明所有此类因素,并确保两层的时间同步。