iOS核心动画(CoreAnimation)之CABasicAn
了解CoreAnimation
-
CoreAnimation是苹果提供的一套基于绘图的动画框架。
image
上图是苹果给出的体系结构,最低层是硬件层(GPU),上层是OpenGL和CoreGraphics,再上层CoreAnimation,最上层就是UIKit.
所以CoreAnimation是基于OpenGL和CoreGraphics封装的,并不是直接接触硬件层.
- CoreAnimation不是一个独立框架,而是封装在
QuartzCore
框架中. - CoreAnimation是作用于
layer
,不是View
,这点要注意.
CABasicAnimation使用
CoreAnimation包含了许多的高级动画效果,CABasicAnimation只是其中一小部分,也是最基础动画.
CABasicAnimation的常用属性详解
- timingFunction
可选
控制动画的运行节奏;有以下5种类型
类型 | 描述 |
---|---|
kCAMediaTimingFunctionLinear | 均速(线性运行) |
kCAMediaTimingFunctionEaseIn | 先缓慢进入,再加速离开 |
kCAMediaTimingFunctionEaseOut | 全速开始,慢慢减速 |
kCAMediaTimingFunctionEaseInEaseOut | 先慢慢加速,再慢慢减速。 |
kCAMediaTimingFunctionDefault | 默认值.先慢慢加速,再慢慢减速,但是它加速减速速度略慢 |
-
fromValue
必选
动画初始值(状态).类型:NSValue
NSNumber
-
toValue
必选
动画结束值(状态).类型:NSValue
NSNumber
-
duration
必选
每次动画时间 -
autoreverses
可选
默认为NO
,当设置为YES时,表示启用回退动画,即由toValue到fromValue做回退动画 -
removedOnCompletion
可选
默认为YES
,动画结束后从layer移除,当设置为NO时,不移除 -
fillMode
可选
控制动画开始之前或者动画结束之后layer
的行为.有以下4种类型
类型 | 描述 |
---|---|
kCAFillModeForwards | 在动画开始前,只需要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始 |
kCAFillModeBackwards | 当动画结束后,layer会一直保持着动画最后的状态 |
kCAFillModeBoth | 动画加入之后在开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态 |
kCAFillModeRemoved | 默认值.动画结束后,不改变layer的状态,layer会恢复到之前的状态 |
-
repeatCount
可选
动画重复次数.默认为0,不可与repeatDuration
同时使用.(非重复动画不用关注此参数) -
repeatDuration
可选
动画重复时间.不可与repeatCount
同时使用,(系统会根据 repeatDuration/duration 计算出要做多少次动画).(非重复动画不用关注此参数)
动画实现
- (void)myAnimation {
NSString *keyPath = @"position";
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:keyPath];
// 速度控制函数,控制动画运行的节奏
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
// YES=启用回退动画,即由toValue到fromValue做回退动画
animation.autoreverses = YES;
// YES=动画结束时从layer移除
animation.removedOnCompletion = YES;
// 控制动画开始之前或者动画结束之后`layer`的行为
animation.fillMode = kCAFillModeForwards;
// 动画初始值(状态),必须设置
animation.fromValue = [NSValue valueWithCGPoint:self.interactView.center];
// 动画结束值(状态),必须设置
animation.toValue = [NSValue valueWithCGPoint:self.targetView.center];
// 重复次数
animation.repeatCount = INT_MAX;
// 每次动画时间,必须设置
animation.duration = 1.8;
// 添加到layer,并开始动;必须设置
[arrowView.layer addAnimation:animation forKey:keyPath];
}
上面代码的动画效果
KeyPath
列表
Apple官方链接:CALayer Animatable Properties
注意: CoreAnimation是作用于layer,layer并没有
frame
属性,所以对frame
是无效的,可通过position
和bounds
间接实现