CoreAnimation是一个复合引擎,它的职责就是尽可能快地组合屏幕上不同的可视内容,这个内容是被分解成独立的图层,存储在一个叫做
图层树
的体系中,图层树
是UIKit以及iOS应用程序中屏幕上所能看见一切的基础。
视图:UIView及其子类
一个视图就是在屏幕上显示的一个矩形块,例如图片、文字或视频。能够拦截处理类似鼠标点击或触摸手势等用户输入。视图在层级关系中可以相互嵌套。父视图可以管理所有子视图的位置。
在iOS中,所有的视图都是从UIView的基类派生出来的
。UIView可以处理触摸事件;可以支持基于Core Graphics绘图;可以做仿射变换(例如旋转或缩放),或者简单的滑动与渐变动画。
图层:CALayer
CALayer在概念上和UIView类似,同样也是一些被层级关系树管理的矩形块,也可以包含图片、文本、背景色等内容,管理子图层的位置,通过方法或属性做动画和变换。CALayer和UIView最大的不同在于CALayer无法处理用户的交互
CALayer并不清楚具体的响应链(iOS通过视图(UIView)层级关系来传递触摸事件的机制),即使它提供了一些方法用来判断一个触点是否在图层的范围之内。
平行的层级关系:UIView与CALayer
每一个UIView都有一个CALayer实例的图层属性,视图UIView的职责就是创建并管理这个图层CALayer,以确保当子视图在层级关系中添加或者移除的时候,他们关联的图层在对应的层级关系中有相同的操作。
实际上视图关联的图层才是真正用来在屏幕是那个显示和做动画的,UIView仅仅是对它的一个封装,提供一些iOS类似于处理触摸的具体功能以及Core Animation底层方法的高级接口
iOS基于UIView和CALayer提供两个平行的层级关系,主要原因在于做职责分离,更好的兼容 iOS 和 Mac OS 平台,把绘图、布局和动画功能应用到独立的 Core Animation 框架中,在 iOS 和 Mac OS 之间共享代码,实现跨平台。
实际上这里不是两个平行的层级关系,还是四个,另外两个分别是呈现树和渲染树
CALayer区别于视图UIView特有的功能如下:
- 阴影、圆角、带颜色的边框
- 3D变换
- 非矩形范围
- 透明遮罩
- 多级非线形动画
CALayer的使用场景:
- 开发跨平台应用时
- 使用多种CALayer的子类,并且不想创建额外的UIView去封装它们
- 做一些对性能特别挑剔的工作,比如对UIView一些可忽略不计的操作都会引起显著的不同(这种情况下,甚至想直接使用OpenGL来绘图)
那么UIView相比于CALayer有哪些优点呢?主要是UIView提供了一些高级的API,比如自动排版、布局和事件处理。