Core Animation

Core Animation的动画执行过程都是在后台操作的,因此不会阻塞主线程,核心动画是直接作用于CALayer对象上的。当对一个UIView视图对象显示的内容进行旋转操作时,其本质是修改UIView的layer属性,对layer所展示的样式进行旋转操作后,再渲染到屏幕上。

CAAnimation类是一个抽象类,因此这里不会直接创建CAAnimation类的对象,而是使用其子类对象。其有3个子类,分别为:

CAPropertyAnimiation属性动画;
CAAnimationGroup动画组;
CATransition转场动画。

其中,CAPropertyAnimiation属性动画又包含两个子类,分别为:
CABasicAnimation基本动画;
CAKeyframeAnimation关键帧动画。
在iOS 9发布后,CABasicAnimation基本动画又添加了一个子类CASpringAnimation弹簧动画。

CAAnimation类遵守了CAMediaTiming协议,在该协议中定义了一些常用的与动画播放相关的属性。常用的包括如下几个。

// beginTime:动画开始播放的时间,默认为0,即立即开始播放。
@property CFTimeInterval beginTime;
// duration:动画持续的时间,默认为0。
@property CFTimeInterval duration;
// speed:动画播放的速度,默认为1,数值越大播放的速度越快,例如,当取值为2时,以两倍速度播放动画。
@property float speed;
// repeatCount:动画重复播放的次数。
@property float repeatCount;
// repeatDuration:动画重复播放的时间间隔。
@property CFTimeInterval repeatDuration;
// fillMode:定义动画播放完毕后的动作,一共有4个可选动作,默认为:kCAFillModeRemoved,即恢复原样。
@property(copy) NSString *fillMode;

CA_EXTERN NSString *const kCAFillModeForwards;
CA_EXTERN NSString *const kCAFillModeBackwards;
CA_EXTERN NSString *const kCAFillModeBoth;
CA_EXTERN NSString *const kCAFillModeRemoved;

CAAnimationDelegate是CAAnimation类的代理协议,其中定义了与动画播放相关的一些方法,主要包括:

// 动画开始播放时调用的方法。
-(void)animationDidStart:(CAAnimation *)anim;
// 动画停止播放时调用的方法,停止播放的原因有可能是动画播放完成,也有可能是人为控制动画停止播放。
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;

当需要创建一个动画时,通常可以按照如下步骤进行:

实例化一个CAAnimation的子类对象,例如CABasicAnimation、CAKeyframeAnimation、CATransition等。
设置动画对象的动画属性。
添加动画对象到一个CALayer类的对象上,并播放动画。

示例

3. CAPropertyAnimiation属性动画类是CAAnimation类的子类,其也是一个抽象类。在实际开发过程中,需要使用其子类,包括:CABasicAnimation类、CAKeyFrameAnimation类。在iOS 9中,CABasicAnimation类引入了一个新的子类CASpringAnimation类。

CAPropertyAnimiation类,从其字面意义上理解其与属性Property相关,即修改Property从而把属性变化的过程通过动画展现出来。在CAPropertyAnimiation类中,通过keyPath属性来设置针对哪个属性变化展现动画。

@property(nullable, copy) NSString *keyPath;
当创建一个CAPropertyAnimiation类型(主要为其各个子类)对象时,都需要设置keyPath属性,以便确定针对哪个外观属性播放动画。

4. CABasicAnimation类是使用最简单的核心动画类,只需要指定keyPath,然后设置起始值(fromValue)和目标值(toValue),然后再把该动画对象添加到一个CALayer类的对象上,即可实现动画的播放。

keyPath的初始值,默认情况下为空。当不设置fromValue的值时,动画播放的初始值取自layer对象的keyPath指定属性的当前值。
@property(nullable, strong) id fromValue;
keyPath的目标值,即变动后的值。
@property(nullable, strong) id toValue;
乘数。当fromValue不为空时,目标值为fromValue乘以byValue;当fromValue为空时,目标值为layer对象的keyPath指定属性的当前值乘以byValue。
@property(nullable, strong) id byValue;
示例

5. CAKeyframeAnimation关键帧动画,可以在一个values数组中设置针对某个keyPath的多个变化值,从而设计出一个相对复杂的动画播放效果,例如,可以设置一个CALayer对象在多个点之间来回移动,或者可以设置多个平移的值。

CAKeyframeAnimation类与CABasicAnimation的区别是:CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个values数组保存多个数值,从而可以实现keyPath指定属性的复杂变化。在values中保存的每个元素都称为一个keyframe,CABasicAnimation可看做是只有两个关键帧的CAKeyframeAnimation。

@property(nullable, copy)NSArray *values;
另外,还可以设计layer的动画运行轨迹path,这里需要用到贝塞尔路径(UIBezierPath),还需要注意的是需要把UIBezierPath对象转成CGPathRef类型的对象。
@property(nullable) CGPathRef path;
示例

6. CASpringAnimation类是iOS 9中新增的类,属于CABasicAnimation的子类,通过CASpringAnimation类可以创建具有弹簧效果的动画。

在CASpringAnimation类的定义中,包含了如下几个属性,可以通过设置这些属性来设置弹簧动画的展示效果。

// mass:质量,影响图层运动时的惯性,mass取值越大,动画的时间越长。
@property CGFloat mass;
// stiffness:弹簧刚度系数,取值0~100,默认取值100。
@property CGFloat stiffness;
// damping:阻尼系数,影响反弹的次数,取值大于0,默认取值10。
@property CGFloat damping;
// 初始速度,默认为0。
@property CGFloat initialVelocity;
// 获取反弹时的停顿时间,只读属性。
@property(readonly) CFTimeInterval settingDuration;
示例

 7. CAAnimationGroup动画组,顾名思义就是可以创建一组动画对象,在动画播放时,图层可以同时播放多种动画的叠加效果,例如,可以在图层平移过程中同时修改图层的透明度。通过CAAnimationGroup类的对象,可以实现复杂动画的播放效果。

在CAAnimationGroup类中,最核心的一个属性就是animations属性,这是一个数组,可以在该数组中保存多个动画对象,例如,可以保存若干个CABasicAnimation对象。

@property(nullable, copy)NSArray<CAAnimation *> *animations;
示例

8.  CATransition转场动画可以定义图层的显示内容在切换时的动画效果。例如,在导航控制器使用过程中,子控制器的显示与退出效果就是通过CATransition转场动画实现的。另外,在苹果KeyNote中,当切换幻灯片时,也会体现切换的效果。

通过设置CATransition类中的属性,可以定制转场动画的效果。常用的属性主要包括以下几个。

// type:动画的类型。常用的有4种:fade(渐变)、moveIn(移入)、push(推入)、reveal(移出),默认为fade(渐变)。
@property(copy) NSString *type;
// subType:动画的子类型,可以指定动画播放时开始的方位或方向,有4种方式:fromLeft(从左开始)、fromRight(从右开始)、fromTop(从上开始)、fromBottom(从下开始)。
@property(nullable, copy) NSString *subtype;
// 转场动画启动时以及结束时的进度百分比,取值为0~1,通过设置这两个属性,可以实现动画从中间某个状态开始播放,或者在中间某个状态提前结束。
@property float startProgess;
@property float endProgess;
示例

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值