在APP中大多数状况下,将Layer和View对象结合使用是Layer最好的使用方式。然而,不少时候咱们可能须要经过添加单独的Layer对象,以便增长视图继承层次;当为了提升性能,或为了实现View很难实现的特性,此时应该使用Layers,此时也须要知道如何管理咱们建立Layer层次。数组
Layer层次结构在许多方面都和Views层次结构类似。咱们将一个Layer嵌入到另一个Layer里面,此时便在被用做嵌入的Layer(被称为sublayer)和父图层(superlayer)之间造成了父子关系;这种父子关系会对
sublayer的许多方面产生影响。例如,它的content处于它superlayer的上面,它的position也会相对于它的superlayer的坐标系统,它也会受到被应用到它的superlayer的transforms的影响。app
每个Layer对象都有用于添加、插入、移除子layer的方法。表4-1归纳了这些方法和他们的功能。函数
Table 4-1 Methods for modifying the layer hierarchy布局
功能 | 方法 | 描述 |
---|---|---|
添加子layer | addsubLayer: | 为当前的layer添加一个新的sublayer对象,这个要被添加的sublayer会被添加到当前layer的sublayers数组的末尾。相对于sublayers数组中拥有相同zPosition属性值的layer,这个新的sublayer将会呈如今他们的顶部。 |
插入layer | insertSublayer:above: insertSublayer:atIndex: insertSublayer:below: | 以相对于另外的sublayer的position或者index将sublayer插入sublayer层结构。当要插入到另外的sublayer前面或者后面时候,咱们只须要指定sublayer在数组中的位置。Layers对象是否可显示在屏幕上,第一取决于他们的zPosition属性,第二取决于他们在sublayer数组。 |
移除layers | removeFromSuperlayer | 从父layer中移除指定的sublayer |
交换layers的位置 | replaceSublayer:with: | 将两个sublayer的位置进行交换。若是咱们要插入sublayer已经存在于其余的layer层次结构中了,那么这个sublayer将会先从以前的层次中移除 |
对于咱们本身建立的Layer对象,可使用上面的方法;咱们不可使用这些方法调整Layer-backed View 的Layer。可是一个Layer-backed View可以为咱们单首创建的Layers当作父图层。性能
当添加和插入sublayer的时候,在sublayer显示到屏幕上以前,咱们必须为sublayer设置size和position。咱们也能够在将sublayer添加到图层上以后再修改size和position,可是咱们最好将在建立Layer的时候就设置这两个值做为习惯。动画
使用bounds属性能够设置sublayer的尺寸,使用position属性能够
设置sublayer在它的superlayer内的位置。它的bounds的原点一直是(0,0),尺寸size就是咱们设置的大小(以point为单位)。position属性适合layer的anchor point相关联的,anchor point默认是在layer的中心。若是咱们不设置这些值,核心动画将会设置出事宽高为0,并设置position为(0,0)。spa
myLayer.bounds = CGRectMake(0, 0, 100, 100); myLayer.position = CGPointMake(200, 200);
重要提示:确保layer的宽高为整数值。(通常咱们使用的值都是以point位单位的而不是pixel,因此至少要保证在当前设备上的为分辨率的整数个数。)code
子layer的动画行为会受到superlayer的一些属性的影响。speed属性就是其中之一,他将会和动画的speed相乘,这个属性值默认被设置为1.0,若改成2.0将会引发动画以原来速度的2倍运行并以原来一半的时间结束,这个属性不只仅影响它自身还影响它的sublayers。这个改变是能够逐层相乘的累积的。若是sublayer和super都被设置为2.0的speed,sublayer的动画将会以原速度的4倍运行。
许多layer的调整都会对他包含的sublayers产生相应的影响。例如,对layer使用旋转transform,则它全部的sublayer也会受到影响。类似的,改变一个layer的opacity属性也将会影响它的sublayers。layer尺寸的改变遵循布局规则(Adjusting the Layout of Your Layer Hierarchies.)orm
为了响应superlayer的调整,核心动画为调整sublayer的size和position提供几个配置项。在iOS中layer-backed view的普遍使用是的layer层次的建立显得没那么重要;仅仅支持手动更新layout。对于OSX而言,有几个可用的配置可以使咱们方便的管理layer层次。对象
Layer的层次layout仅当咱们使用单首创建的Layer对象时才有意义。若是APP中全部的layer都是和view对应关联的,可使用基于view的layout实现view响应的变化更新size和position。
不像Views,一个superLayer不会自动裁剪超过它的bounds矩形区域的sublayers的content。superlayer容许它的sublayers默认彻底不显示。然而,经过将属性maksToBunnds的值设为YES,能够启用裁剪操做。
Layer的圆角也被Layer的裁剪遮罩的形状包含在内。图4-3显示了masksToBounds属性是如何影响带有圆角的layer的。当masksToBounds属性被置为NO的时候,即便sublayer超出了superlayer的bounds,sublayer也会完整的展现。将masksToBounds属性改成YES将会引发他们sublayer的裁剪。
有时,咱们须要将一个Layer内的某个点坐标值转化为屏幕内其余layer内的坐标值。CALayer类提供了几个简单的转换方法:
除了转换点和矩形值以外,经过使用convertTime:fromLayer:和convertTime:toLayer: ,咱们还能在layers之间转换time值。每个layer都有他们本身的time空间,并使用它的time空间来和系统参考系同步动画的开始和结束。这些time空间默认是同步的;可是,若是咱们改变一些layer的speed,那么那些layer的time空间也将会相应的变化。咱们可使用时间转换方法获取这些因子,并确保两个layer的时间函数是同步的。