Core Animation
1.核心动画,是一组非常强大的动画处理api,动画执行过程在后台,不会阻塞主线程,直接作用在CALayer上的。
CAAnimation 是所有动画对象的父类,负责控制动画的持续时间和速度,是一个抽象类,不能直接使用,应该使用其具体的子类。
属性说明:
duration : 动画持续时间
repeatCount : 重复次数,无限循环可以设置HUGE_VALF或者MAXFLOAT
repeatDuration : 重复时间
removedOnCompletion : 默认YES,表示动画执行完毕后就从图层上移除,图形就会恢复到执行动画前的状态。如果想让图层保存显示动画执行完毕的状态,那就设置为NO,而且还需要设置fileMode为kCAFillModeForwards
fileMode : 决定当前对象在非active时间段的行为,比如动画开始前后。
当动画结束后,layer会一直保持着动画最后的状态
CA_EXTERN NSString * const kCAFillModeForwards
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
在动画开始前,只需要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始
CA_EXTERN NSString * const kCAFillModeBackwards
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态
CA_EXTERN NSString * const kCAFillModeBoth
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
默认值也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
CA_EXTERN NSString * const kCAFillModeRemoved
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
beginTime : 可以用来设置动画延时的时间,CACurrentMediaTime() + 2,CACurrentMediaTime()当前图层的时间
timingFunction : 速度控制函数,控制动画运行节奏。
delegate : 动画代理
速度控制函数:
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
线性):匀速,给你一个相对静态的感觉
CA_EXTERN NSString * const kCAMediaTimingFunctionLinear
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
渐进):动画缓慢进入,然后加速离开
CA_EXTERN NSString * const kCAMediaTimingFunctionEaseIn
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
渐出):动画全速进入,然后减速的到达目的地,默认动画
CA_EXTERN NSString * const kCAMediaTimingFunctionEaseOut
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为。
CA_EXTERN NSString * const kCAMediaTimingFunctionEaseInEaseOut
CA_AVAILABLE_STARTING (10.5, 2.0, 9.0, 2.0);
它和kCAMediaTimingFunctionEaseInEaseOut很类似,但是加速和减速的过程都稍微有些慢。但不是默认动画
CA_EXTERN NSString * const kCAMediaTimingFunctionDefault
CA_AVAILABLE_STARTING (10.6, 3.0, 9.0, 2.0);
代理方法:
- (void)animationDidStart:(CAAnimation *)anim{
//动画开始的时候调用
}
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
//动画停止的时候调用
}
CALayer 动画暂停
CFTimeInterval ptime = [layer convertTime:CACurrentMediaTime() fromLayer:nil] ;
//设置CALayer的时间为0
layer.speed = 0.0;
//让时间停留在这个点(需要记录时间)
layer.timeOffset = ptime;
动画恢复
CFTimeInterval ptime = layer.timeOffset;
layer.speed = 1.0;
//取消掉上次停留的时间
layer.timeOffset = 0.f;
//取消上次设置的时间
layer.beginTime = 0.0;
//计算暂停的时间
CFTimeInterval timeS = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - ptime;
//相对父视图的开始时间
layer.beginTime = timeS;
2.动画分类
基本动画CABasicAnimation
CABasicAnimation *animation = [CABasicAnimation animation];
animation.keyPath = @"position";
//动画开始KeyPath的初始化值
animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(100, 500)];
//动画结束KeyPath的初始化值
animation.toValue = [NSValue valueWithCGPoint:CGPointMake(100, 50)];
//动画持续时间
animation.duration = 10;
//动画执行完毕 不删除动画
animation.removedOnCompletion = NO;
//保持动画状态
animation.fillMode = kCAFillModeForwards;
// 动画是否重复
animation.repeatCount = MAXFLOAT;
//动画的方式
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
//代理
animation.delegate = self;
[_CAView.layer addAnimation:animation forKey:nil];
关键帧动画CAKeyframeAnimation
_CAView.frame = CGRectMake(0, 0, 10, 10);
CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
//设置动画路径
animation.keyPath = @"position";
NSValue *v1 = [NSValue valueWithCGPoint:CGPointMake(10, 10)];
NSValue *v2 = [NSValue valueWithCGPoint:CGPointMake(300, 10)];
NSValue *v3 = [NSValue valueWithCGPoint:CGPointMake(300, 300)];
NSValue *v4 = [NSValue valueWithCGPoint:CGPointMake(10, 300)];
NSValue *v5 = [NSValue valueWithCGPoint:CGPointMake(10, 10)];
NSValue *v6 = [NSValue valueWithCGPoint:CGPointMake(300, 300)];
NSValue *v7 = [NSValue valueWithCGPoint:CGPointMake(10, 10)];
animation.values = @[v1,v2,v3,v4,v5,v6,v7];
animation.duration = 10;
animation.repeatCount = MAXFLOAT;
[_CAView.layer addAnimation:animation forKey:nil];
CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
anim.keyPath = @"position";
anim.removedOnCompletion = NO;
anim.fillMode = kCAFillModeForwards;
anim.duration = 10;
anim.repeatCount = MAXFLOAT;
//创建一个路径
CGMutablePathRef path = CGPathCreateMutable();
//路径轨迹
CGPathAddEllipseInRect(path, nil, CGRectMake(100, 100, 100, 100));
anim.path = path;
//释放路径
CGPathRelease(path);
[_CAView.layer addAnimation:anim forKey:nil];
动画组CAAnimationGroup
CAAnimationGroup *group = [CAAnimationGroup animation];
创建旋转动画
CABasicAnimation *retate = [CABasicAnimation animation];
retate.keyPath = @"transform.rotation";
retate.toValue = @(M_PI);
创建缩放动画
CABasicAnimation *scale = [CABasicAnimation animation];
scale.keyPath = @"transform.scale";
scale.toValue = @(0.1);
添加到动画组
group.animations = @[retate,scale];
group.duration = 5.0;
group.removedOnCompletion = NO;
group.fillMode = kCAFillModeForwards;
[view.layer addAnimation:group forKey:nil];
转场动画CATransition
CATransition *anim = [CATransition animation];
//动画类型
anim.type = @"cube";
anim.duration = 1;
anim.subtype = kCATransitionFromTop;
[self.view.layer addAnimation:anim forKey:nil];
转场动画的类型(NSString *type)
fade : 交叉淡化过渡
push : 新视图把旧视图推出去
moveIn: 新视图移到旧视图上面
reveal: 将旧视图移开,显示下面的新视图
cube : 立方体翻滚效果
oglFlip : 上下左右翻转效果
suckEffect : 收缩效果,如一块布被抽走
rippleEffect: 水滴效果
pageCurl : 向上翻页效果
pageUnCurl : 向下翻页效果
cameraIrisHollowOpen : 相机镜头打开效果
cameraIrisHollowClos : 相机镜头关闭效果