iOS拥有强大的动画特效,今天来说一下动画中的关键帧动画
核心动画类中,关于关键帧动画,主要包含如下三个类
- CABasicAnimation 基础动画
- CAKeyframeAnimation 关键帧动画
- CAAnimationGroup 组合动画
我这里说的 关键帧动画,是指的广义上的一种动画制作方式,并不仅指 CAKeyframeAnimation
,CABasicAnimation
的实现方式也属于 关键帧动画,而CAAnimationGroup
我也放在这里一起说了,它也主要是结合上面两种动画方式。
关键帧
如果我们想实现这么一个动画:一个水杯放在桌子的左边,移动到右边,那么我们实际操作的,只是水杯。
所以动画的实现,只是对运动变化了的部分的处理。
上面的例子,可以变成一个涉及数学和物理的问题:一个杯子初始位置在左边,n秒后匀速运动到右边,那么在每 1/60 秒的时候,这个杯子的位置显然是可以计算出来的了。
所以,我们其实只需要指定一些 关键 信息就能让计算机自己计算出每一帧杯子的位置了:
- 起始位置,比如一个坐标 (0,0)
- 结束位置,再比如一个坐标 (100,0)
- 动画总时间,比如 0.25 秒
- 匀速运动
这种方式就称之为 关键帧动画。即我们只需要给定几个关键帧的画面信息,关键帧与关键帧之间的过渡帧都将由计算机自动生成。
关于快速入手动画可以看我之前写的这篇文章
CABasicAnimation
1 | import UIKit |
CAKeyframeAnimation
1 | import UIKit |
CAAnimationGroup
1 | import UIKit |
最后
具体代码较为简单,细节不多说了,提一下关于关键帧动画类对象初始化时候的keyPath
,该属性是根据CALayer类的属性来的,所以需要什么属性可以去CALayer类中查找。
在这里列一下常用属性如下:
值 | 说明 | 使用形式 |
---|---|---|
transform.scale | 比例转化 | @(0.8) |
transform.scale.x | 宽的比例 | @(0.8) |
transform.scale.y | 高的比例 | @(0.8) |
transform.rotation.x | 围绕x轴旋转 | @(M_PI) |
transform.rotation.y | 围绕y轴旋转 | @(M_PI) |
transform.rotation.z | 围绕z轴旋转 | @(M_PI) |
cornerRadius | 圆角的设置 | @(50) |
backgroundColor | 背景颜色的变化 | (id)[UIColor purpleColor].CGColor |
bounds | 大小,中心不变 | [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)]; |
position | 位置(中心点的改变) | [NSValue valueWithCGPoint:CGPointMake(300, 300)]; |
contents | 内容,比如UIImageView的图片 | imageAnima.toValue = (id)[UIImage imageNamed:@”to”].CGImage; |
opacity | 透明度 | @(0.7) |
contentsRect.size.width | 横向拉伸缩放 | @(0.4)最好是0~1之间的 |
fillMode属性:
- kCAFillModeRemoved 设置为该值,动画将在设置的 beginTime 开始执行(如没有设置beginTime属性,则动画立即执行),动画执行完成后将会layer的改变恢复原状。
- kCAFillModeForwards 设置为该值,动画即使之后layer的状态将保持在动画的最后一帧,而removedOnCompletion的默认属性值是 YES,所以为了使动画结束之后layer保持结束状态,应将removedOnCompletion设置为NO。
- kCAFillModeBackwards 设置为该值,将会立即执行动画的第一帧,不论是否设置了 beginTime属性。观察发现,设置该值,刚开始视图不见,还不知道应用在哪里。
- kCAFillModeBoth 该值是 kCAFillModeForwards 和 kCAFillModeBackwards的组合状态
参考文章