CoreAnimation :在字面意思为“核心动画”,但是如果您认为它仅仅是一个动画框架,那可能就要错过一些经典功能了。动画,只是CoreAnimation功能的一小部分,毕竟人家的源头是一个叫做Layer Kit的库演变而来,和动画无关。
CoreAnimation作为一个复合引擎,将不同的视图层组合在屏幕中,并且存储在图层树中,向我们展示了所有屏幕上的一切。而图层树又是什么呢?下面来探讨一下第一个概念图层树:
图层树:如果您开发过iOS/ipad应用程序,并且使用过Xcode中提供的一个如下图视图调试工具:
就会发现,视图上的所有子视图,都是有很明显的视图层次感的,其实,这就是图层树的一种不完全正确的表达形式。不完全正确是因为我们现在看到的,大部分是UIViewController和UIView对象的层次关系,真正的CALayer图层树,其实是CALayer对象组合而成,相信大家对CALayer都不算陌生,因此在这里就不多赘述,只做简单描述。
CALayer类在概念上和UIView类似,同样可以向UIView一样被层级关系树管理,也可以显示一些内容,也可以进行图层的位置变换,甚至可以像UIView一样来进行动画。它和UIView最大的不同就是CALayer不处理用户的交互行为,它并不清楚具体的响应链,因此它并不能响应事件,即使它提供了一些方法来判断某个触点是否在图层的范围之内。
每个UIView都有一个CALayer对象的图层属性,视图的职责就是创建并管理这个图层,以确保当子视图在层级关系添加或者被移除的时候,他们关联的图层也同样对应在层级关系中有相同的操作。而实际上,我们眼中的屏幕中的所有,都是UIView背后的那写layer对象来实现的,UIView的各种操作,仅仅是对layer的一个封装,并提供了一些响应功能和高级动画API。看到这里,可能有朋友会有疑问,既然关系为封装,为何又要进行UIView和CALayer的分离呢?为什么不直接使用一个层级进行响应事件和内容显示呢?原因在于要做到职责分离,这样也能避免很多重复代码。虽然它们功能上很相似,但在实现上具有显著的区别。
其实,一个视图上,不仅存在UIView和CALayer两个层次树,还存在呈现树和渲染树。当前层面仅供了解,后续会陆续讲到。
图层的功能:
如果说CALayer是UIView内部的具体实现细节,为什么我们还要全面的了解它呢,毕竟apple已经为我们提供了简单易用的UIView接口。在某种意义上来说的确是这样的,对一些简单的需求来说,我们确实没有必要处理CALayer,比如说简单动画,我们完全可以使用UIView提供的高级动画API。然而,举个小例子,如果我们需要一些自定义高级复杂的动画,你会发现,系统UIVIew的API,并不能满足或者说很难满足我们的需求,这时,我们就需要介入CoreAnimation底层之外了。这仅仅是个小例子,对于图层,它拥有UIView没有的功能如下:
- 阴影
- 3D变换
- 非矩形范围
- 透明遮罩
- 多级非线性动画
这些功能我们将在未来章节中继续讨论。