构建图层的层次
大多数情况下,使用图层的最好方式就是和视图对象一起使用。然而有时你需要通过额外的图层来增强你的视图层次。你可能使用图层来提高性能或者实现那些视图无法达到的某一特性。在这种情况下,你需要知道如何管理和创建图层的层次结构。
将图层以图层层次的结构管理
图层的层次就像视图的层次。你将一个图层放进某一父图层就创建了一种parent-child管理在图层之间。这种关系影响到子图层各方面。比如,子图层的内容在父图层之上,子图层的位置相对于父图层的相对做标记。同时父视图的转换也会影响到子图层。
添加,插入,移除图层
每一个图层对象都有方法来进行添加,移除,插入。表4-1总结了这些方法
行为 方法 描述
添加图层 addSublayer: 在当前图层内添加新的子图层。子图层在图层列表的最后。这就导致了子图层显示在同一层次(有相同的zPostion属性的)的最上面
插入图层 insertSublayer:above: 在某一位置插入图层,图层的位置由zPosition决定
insertSublayer:atIndex:
insertSublayer:below:
移除图层 removeFromSuperlayer 从父视图中移除自身
图层替换 replaceSublayer:with: 很简单的替换
调整和设置图层的位置
当添加和插入图层的时候,必须制定图层的大小和位置。可以在将图层添加进图层层次之后进行修改,
但是记得在新建的图层并赋值。
通过设置图层的bounds属性设置图层大小,position属性来设置图层在父图层中的位置。position属性总是相对于图层的定位点(anchor point),默认图层的定位点是在中心。如果你不给图层赋值大小和位置属性,那么这些都默认是(0,0)。
myLayer.bounds = CGRectMake(0, 0, 100, 100);
myLayer.position = CGPointMake(200, 200);
图层的层次性如何影响动画
某些父图层的属性能够影响其子图层的动画特性。比如速度speed属性,对于动画速度来说就是加速动画效果。默认是1.0,如果改成2.0,将会让本来同等时间的动画能够播放两边,因此动画只需要原本一般的时候完成。当父视图的speed改成2.0后,子视图完成速度也会变成两倍(子视图是默认1.0)。如果子视图和父视图都将speed 都设成2.0,那么子视图中的动画将会以四倍速完成。
但是大多数父视图对自视图的影响都是可预知的。比如对父视图的旋转将会影响到子视图。
调整图层层次的布局
在iOS中,很多视图都是基于图层的视图,很少出现单独的图层,所以这一部分对于IOS并不是很重要。但是在OS X中却是很有用的,例子讲解了很多OS X中的布局。所以略过。
多图层和裁剪
不像视图,子图层并不会自动裁剪超出子图层边界的内容。子图层默认允许完全展示图层内容。但是如果你要重新使得裁剪设置生效,那么久将masktToBounds设置为YES。
图层裁剪遮蔽效果的形状包括图层的圆角。如果指定了圆角弧度,图4-3说明了图层的maskToBouns属性是如何影响圆角的。当该属性设置为NO的时候,子图层将完全的展示其内容。将该属性设置为YES后,超出部分将被裁减。
转换图层间的坐标
有时,你可能需要将该图层中的坐标值,转换成在另外一个图层中的坐标。CALayer类提供了一组简单的转换途径让你达到该目的:
convertPoint:fromLayer:
convertPoint:toLayer:
convertRect:fromLayer:
convertRect:toLayer:
除了转换点和方框值,你也可以转换两个图层间的时间值。每一个图层都有自己局部时间间隔,并使用该时间间隔来同步动画的起始和结束。这些时间间隔被默认方式同步。但是,如果你改变一组动画的速度,那么时间间隔就必须统一。