转 iOS Core Animation 动画 入门学习(一)基础

时间:2021-08-31 07:06:32

iOS Core Animation 动画 入门学习(一)基础

  reference:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40004514

  在iOS中,每个view中都自动配置了一个layer,我们不能人为新建,而在Mac OS中,view默认是没有layer的,需要手动设置是否开启layer(10.8以后默认是开启状态),因为开启layer是需要一定代价的,那就是需要开销额外的内存。

  view负责显示的内容,而layer负责显示内容的几何特性,在屏幕上的位置,是否被旋转、缩放,透明度等变化。

  和view一样,layer也有frame和bounds两个属性,但我们无法人为的改变frame的值,frame是由position和bounds两个属性决定的。bounds很好理解,一宽一高,决定了自己的大小。而position是相对于父视图的位子坐标。需要注意的是,到底是哪个点相对于父视图的坐标呢?这里我们需要先了解一个属性的概念:anchorPoint(锚点)。它是一个单位向量,x,y都是一个[0.0,1.0]的float值,用来表示position相对于自身宽高的比重,默认值是(0.5,0.5),即在layer的中心点。

  看一个例子,我们就很容易理解position,bounds,anchorPoint的关系了。(iOS的坐标系是左上为原点,OS X则是左下为原点的,这里主要说iOS)

  转 iOS Core Animation 动画 入门学习(一)基础

  这也anchorPoint究竟有什么用呢?在静止的时候我们还真看不出来,anchorPoint不同对整个layer有什么影响,我们再来看看另一张图:

  转 iOS Core Animation 动画 入门学习(一)基础

  哈哈,顾名思义,锚点就是固定点的意思嘛,如果执行旋转的话,就是绕着锚点转呗。当然,如果移动位置的话,也是相当于拉着这个锚点在动。

  position和anchorPoint其实是一个点,只不过position是个Point,而anchorPoint是个向量。所以position+anchorPoint+bounds就能确定一个Layer。

  想学动画,光在平面上动来动去,转来转去也没啥意思啊,Layer还支持3D动画(其实个人感觉应该叫伪3D,哈哈)。

  这里我们先要来了解一个属性,transform(变化矩阵)。每个layer有两个transform,transform&sublayerTransform。transform同时对layer和它的sublayer起效,用来执行缩放,旋转,移动等动画。sublayerTransform顾名思义只是针对sublayer的变化,通常用来给它的展示内容添加透视效果。

  tranform实际上是一个4x4的矩阵,如图:

  转 iOS Core Animation 动画 入门学习(一)基础

  数学好的同学们应该一看就知道什么意思,不过好在我们几本不用直接操作这个矩阵,用设置键值对的方式就可以完成几本的矩阵变化,参考 CATransform3D Key Paths

  看看下面的demo,我们就可以大概了解矩阵里每个值代表什么含义了。

  转 iOS Core Animation 动画 入门学习(一)基础

  identity是默认情况下的单位矩阵,没有任何变化。

  translate是平移矩阵,变化后为[x+tx, y+ty, z+tz, 1]。

  scale是缩放矩阵,变化后为[x.tx, y.ty, z.tz, 1]。

  后面三个分布是以x轴,y轴,z轴为轴,旋转角度θ,以以x轴旋转为例,变化后为[x, y.cosθ+z.sinθ, -y.sinθ+z.cosθ, 1]。

  刚开始的时候可能比较晕,没关系,iOS系统给我们提供了专门执行这些常用变化的函数,参考Animation Function Reference

  layer跟view一样,用树形结构来组织,Core Animation的App用3套layer对象来控制在屏幕上动态显示的内容。

  model layer tree:简称layer tree,就是我们印象中的layer的模型,这里面存储了所以的变化信息,当你修改layer的属性时,就有用到这里的对象。

  presentation tree:动态树,用来存储layer在屏幕上执行动画的某时刻的值,不能修改它的值,可以用它的值来判断是否要开启新的动画,或者判断碰撞等。

  render tree:渲染树,提供真是的动画,对Core Animation是不可修改的。

  每套layer对象的树形结构都跟view的树形结构完全吻合,每个view都会有layer对象与之对应。但是有点跟view tree不太一样的地方是,layer的树形结构中可以加入额外的layer对象,我们可以在不影响view开销的情况下,加入额外的layer对象来优化view的动态效果。

  注意:presentation tree只能在动画执行的过程中读取,不像layer tree那样,读取时总是反应了layer动画的最终状态。

  本次总结主要是对Layer的理解,大家是否对frame,bounds,position,anchorPoint,transform等属性,还有layer的三种树形结构有了更深的认识了呢?新手们大家一起学习进步,同时也欢迎大师们批评指正