前记
关于实现一个iOS动画,如果简单的,我们可以直接调用UIView
的代码块来实现,虽然使用UIView
封装的方法很方便,但是这只能用于一些简答的动画,如果是一些复杂的动画呢?这就不得不去研究下核心动画Core Animation
(包含在Quartz Core
框架中)了。这这之前我们必须了解,CALayer
就包含在Quartz Core
框架中,这是一个跨平台的框架,既可以用在iOS中又可以用在Mac OS X中。在使用Core Animation
开发动画的本质就是将CALayer
中的内容转化为位图从而供硬件操作,所以要熟练掌握动画操作必须熟悉CALayer
,关于CALayer
就不在这里讲了。今天主要是分析核心动画,iOS 中的核心动画又分为下面几种:基础动画、关键帧动画、动画组、转场动画、弹簧动画。下面我们先来了解下各个动画之间的关系
动画简介
CAAnimation
@interface CAAnimation : NSObject
<NSCoding, NSCopying, CAMediaTiming, CAAction>
{
@private
void *_attr;
uint32_t _flags;
}
这是核心动画的基类,不能直接使用,主要负责动画的时间、速度等,从上面可以看出是准守CAMediaTiming
协议的。
CAPropertyAnimation
属性动画的基础类,继承自CAAnimation
,不能直接使用。何谓属性动画呢?即通过修改属性值就可以产生动画效果。
CAAnimationGroup
动画组,继承自CAAnimation
,顾名思义就是一种组合动画,可以通过动画组来进行所有动画行为的统一控制,组中所有动画效果可以并发执行。
CATransition
转场动画,继承自CAAnimation
,主要是通过滤镜来进行动画的效果设置
CABasicAnimation
基础动画,继承自CAPropertyAnimation
,通过属性控制动画的参数,只要初始状态和结束状态
CAKeyframeAnimation
关键帧动画,继承自CAPropertyAnimation
,也是通过属性控制动画参数,但是与基础动画不同的是有多个控制状态,并且可以通过path
来实现动画
CASpringAnimation
弹簧动画,是在iOS 9中引入的,继承自CABasicAnimation
,用于制作弹簧动画
动画使用
在使用动画之前,先补充个知识点—UIBezierPath, 这在动画使用的过程中会经常用到
核心动画
要使用核心动画,我们必须先了解下其属性,这里我们先看其遵守的协议<CAMediaTiming>
属性 | 说明 |
---|---|
beginTime | 指定动画开始的时间。开始延迟几秒的话,设置为CACurrentMediaTime() + 秒数 的方式即可 |
duration | 动画的时长 |
speed | 动画的速度 |
timeOffset | 详细说明 |
repeatCount | 动画重复的次数,如果要一直持续设置为HUGE_VALF 即可 |
repeatDuration | 设置动画的时间。在该时间内动画一直执行,不计次数 |
autoreverses | 动画结束时是否执行逆动画 |
fillMode | 分四种情况,分别为kCAFillModeForwards 、kCAFillModeBackwards 、kCAFillModeBoth 、kCAFillModeRemoved ,决定当前对象在非active时间段的行为,比如动画开始之前或者动画结束之 |
CAAnimation
属性
属性 | 说明 |
---|---|
timingFunction | 速度控制函数,控制动画运行的节奏 |
removedOnCompletion | 默认为YES ,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为NO ,不过还要设置fillMode 为kCAFillModeForwards |
关于fillMode
的四种情况:
kCAFillModeRemoved
默认值,动画结束后,layer会恢复到之前的状态kCAFillModeForwards
当动画结束后,layer会一直保持着动画最后的状态,而removedOnCompletion
的默认属性值是YES
,所以为了使动画结束之后layer保持结束状态,应将removedOnCompletion
设置为NO
。kCAFillModeBackwards
在动画开始前,只需要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始。kCAFillModeBoth
这个其实就是上面两个的合成,动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态
关于速度CAMediaTimingFunction
控制的四种情况
- kCAMediaTimingFunctionLinear
(线性):匀速,给你一个相对静态的感觉
kCAMediaTimingFunctionEaseIn
(渐进):动画缓慢进入,然后加速离开kCAMediaTimingFunctionEaseOut
(渐出):动画全速进入,然后减速的到达目的地kCAMediaTimingFunctionEaseInEaseOut
(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为。
属性动画
从上图中我们知道,属性动画是继承自核心动画,在其API中我们可以看到有如下函数和属性
+ (instancety