Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程。
核心动画继承结构
 核心动画继承结构
注意:核心动画中的虚类不能使用,而应该使用他们子类中的实类。
Core Animation的使用步骤
如果是Xcode6之前的版本,要导入<QuartzCore/QuartzCore.h>框架(并不存在什么CoreAnimation 框架)
开发步骤:
-
首先得有CALayer(因为CoreAnimation是作用在CALayer上的)
-
初始化一个CAAnimation对象,并设置一些动画相关属性
-
通过调用CALayer的addAnimation:forKey: 方法,增加CAAnimation对象到CALayer中,这样就能开始执行动画了
-
通过调用CALayer的removeAnimationForKey: 方法可以停止CALayer中的动画
CAAnimation中的一些属性:
-
duration :动画的持续时间
-
repeatCount :重复次数,无限循环可以设置HUGE_VALF或者MAXFLOAT
-
repeatDuration :重复时间
-
removedOnCompletion :默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为NO,不过*还要设置fillMode为kCAFillModeForwards*
-
beginTime :可以用来设置动画延迟执行时间,若想延迟2s,就设置为CACurrentMediaTime()+2 ,CACurrentMediaTime()为图层的当前时间
-
timingFunction :速度控制函数,控制动画运行的节奏
-
delegate :动画代理
-
fillMode 决定当前对象在非active时间段的行为。(要想fillMode有效,最好设置removedOnCompletion = NO)
-
kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
-
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态 kCAFillModeBackwards 在动画开始前,只需要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始。
-
kCAFillModeBoth 这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态
-
CAMediaTimingFunction :速度控制函数
-
kCAMediaTimingFunctionLinear (线性):匀速,给你一个相对静态的感觉
-
kCAMediaTimingFunctionEaseIn (渐进):动画缓慢进入,然后加速离开
-
kCAMediaTimingFunctionEaseOut (渐出):动画全速进入,然后减速的到达目的地
-
kCAMediaTimingFunctionEaseInEaseOut (渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为。
CAAnimation代理方法
CAAnimation在分类中定义了代理方法。是给NSObject添加的分类,所以任何对象,成为CAAnimation的代理,都可以。
CALayer上动画的暂停和恢复
-
暂停
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
// 让CALayer的时间停止走动
layer.speed = 0.0;
// 让CALayer的时间停留在pausedTime这个时刻
layer.timeOffset = pausedTime;
}
-
恢复
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = layer.timeOffset;
// 1. 让CALayer的时间继续行走
layer.speed = 1.0;
// 2. 取消上次记录的停留时刻
layer.timeOffset = 0.0;
// 3. 取消上次设置的时间
layer.beginTime = 0.0;
// 4. 计算暂停的时间(这里也可以用CACurrentMediaTime()-pausedTime)
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
// 5. 设置相对于父坐标系的开始时间(往后退timeSincePause)
layer.beginTime = timeSincePause;
}
CABasicAnimation——基本动画
CAKeyframeAnimation——关键帧动画
CABasicAnimation可看做是只有2个关键帧的CAKeyframeAnimation
CAAnimationGroup——动画组
默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间
转场动画——CATransition
1. 单视图
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;
- 参数说明:
-
duration :动画的持续时间
-
view :需要进行转场动画的视图
-
options :转场动画的类型
-
animations :将改变视图属性的代码放在这个block中
-
completion :动画结束后,会自动调用这个block
2. 双视图
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion;
- 参数说明:
-
duration :动画的持续时间
-
options :转场动画的类型
-
animations :将改变视图属性的代码放在这个block中
-
completion :动画结束后,会自动调用这个block
3. 自己写转场
- 创建转场动画:
[CATransition animation]
- 设置动画属性值
- 添加到需要转场动画的图层上
[layer addAnimation:animation forKey:nil]
转场动画的类型(NSString *type)
-
fade : 交叉淡化过渡
-
push : 新视图把旧视图推出去
-
moveIn : 新视图移到旧视图上面
-
reveal : 将旧视图移开,显示下面的新视图
-
cube : 立方体翻滚效果
-
oglFlip : 上下左右翻转效果
-
suckEffect : 收缩效果,如一块布被抽走
-
rippleEffect : 水滴效果
-
pageCurl : 向上翻页效果
-
pageUnCurl : 向下翻页效果
-
cameraIrisHollowOpen : 相机镜头打开效果
-
cameraIrisHollowClos : 相机镜头关闭效果
转场动画的方向(NSString *subtype)
-
从某个方向开始:fromLeft , fromRight , fromTop ,fromBottom
CoreAnimation中的CALayer
1. CAReplicatorLayer:复制图层
顾名思义,复制图层就是用来复制的。它会将自己的子图层进行复制,连同子layer上的动画会一起复制。
2. CAShapeLayer:形状图层
根据形状,绘制内容的图层
3. CAGradientLayer:渐变图层
用这个图层,可以做颜色的渐变
最后:
|