深知苹果的动画是世界一流的,因此从本篇文章开始,将陆续发出iOS有关的图层与动画相关的学习总结。
目录
1. Core Animation
Core Animation的前身是Layer Kit。本身并不是真正做动画的,下面看看官方提供的Core Animation在框架中的结构位置:
虽然名称给人的感觉是做动画的,其实Core Animation是一个用于管理视图排版,合成,渲染,动画等的一个基础的framework。其底层是openGL和CG框架。关于Core Animation的视图方面,主要是其核心成员CALayer,这个稍后会简单介绍一下。后续会专门介绍它。
了解完这个, 再看看Core Animation的继承树:
(好家伙, 官网这个图有问题, 我P了一下)
先来简单介绍一下:
-
CAAnimation是核心动画的基类, 不能直接使用, 主要负责动画的时间, 速度等, 本身实现了CAMediaTiming协议。
-
CAMediaTiming协议定义了动画的时间系统.
-
CAPropertyAnimation顾名思义就是属性动画, 继承自CAAnimation,不能直接使用,要想创建动画对象,应该使用它的两个子类:CABasicAnimation和CAKeyframeAnimation
-
CABasicAnimation, 继承自属性动画, 主要用于制作比较单一的动画,例如,平移、缩放、旋转、颜色渐变、边框的值的变化等,也就是将layer的某个属性值从一个值到另一个值的变化.它还有一个子类是CASpringAnimation,是苹果新加入用于弹簧动画的.
-
CAKeyframeAnimation关键帧对话, 允许以线性或非线性的方式设置一组目标值的动画。关键帧动画由一组目标数据值和每个值到达的时间组成。
2. 图层与视图
说完上面的Core Animation后,来说一说图层。
2.1 视图
在iOS中,所有的视图都是从UIView中继承而来,包含我们自己自定义的视图。首先来看看UIView的继承关系图。
2.2 CALayer
UIView中有一个CALayer的对象,平时为了处理阴影,圆角的时候,我们会和该对象打交道。
看到CALayer的前缀可以联想到前一节说的 Core Animation。
UIView实则是封装了CALyer,CALayer是真正用来显示图像和实现动画的。而接受用户操作行为和图层的管理交给UIView,显示图像交给CALayer。
之所以实现一个单独的CALayer,是因为除了iOS平台,还有OS X平台也可以使用代码来显示图像。
后面我们会见到封装的某些对应的接口,如:
CALayer:makeToBounds
UIView:clipsToBounds
2.3 图层的能力
2.4 图层的使用
2.4.1 简单使用
如果仅仅改变某几个简单分属性,只需要改变该UIView的layer中属性就可以,例如:
view.layer.xxx
xxx这是上一小节列出的属性。
2.4.2 子图层
我们知道UIView中,视图的图层是通过添加子视图来实现的:
- (void)addSubView:(UIView *)view;
同样的,对于CALayer也有一个类似的API来添加子图层:
- (void)addSublayer:(CALayer *)layer;
2.4.3 自定义子图层
在我们要使用一个关于相机的controller的时候,会使用相机会提供一个预览图层:AVCaptureVideoPreviewLayer。这其实也是一个CALayer,我们需要将这个layer添加到子图层上,并且需要设置同步session。但是出了添加这个方法,还是可以使用UIView的一个类方法:
+ (Class)layerClass;
每一个UIView都是寄宿在一个CALayer的示例上。这个图层是由视图自动创建和管理的,那我们可以用别的图层类型替代它么?一旦被创建,我们就无法代替这个图层了。但是如果我们继承了UIView,那我们就可以重写+layerClass方法使得在创建的时候能返回一个不同的图层子类。UIView会在初始化的时候调用+layerClass方法,然后用它的返回类型来创建宿主图层。
2.4.4 总结
最后总结一下,使用图层和UIView的时机:
使用UIView
使用图层关联的视图而不是CALayer的好处在于,你能在使用所有CALayer底层特性的同时,也可以使用UIView的高级API(比如自动排版,布局和事件处理)
- 使用CALayer
当满足以下条件的时候,你可能更需要使用CALayer而不是UIView:
开发同时可以在Mac OS上运行的跨平台应用
使用多种CALayer的子类,并且不想创建额外的UIView去包封装它们所有。
做一些对性能特别挑剔的工作,比如对UIView一些可忽略不计的操作都会引起显著的不同。
总的来说,处理视图会比单独处理图层更加方便。
3. 总结
在其他资料中,我们可以见到图层树,呈现树,渲染树等。这里统一说一下我的理解。
图层树:代码中我们所建立的图层之间的父子关系
呈现树:当前呈现的图层。这个主要是在使用属性动画的时候,更改了图层的属性,但是图层树已经改变,但是当前呈现树还没有改变,后面会有关于呈现树的接口介绍。
渲染树:iOS中,应用进程会将图像数据通过IPC,发送到专门渲染图像的进程。这个时候就是渲染树。
本篇文章只是作为引入而写的。后面则是关于图层的属性、专用图层、动画以及相关的知识。