IOS动画(CALayer、CoreAnimation简介)
一。CALayer
优点:
- 每个UIView上都可以放置几百个CALayer
- Core Animation动画在单独的线程总完成,不会阻塞主线程
- Core Animation动画只重绘界面上变化的部分
提供的方法:
- addAnimation:forKey: 添加一个动画并制定对应的key
- animationForKey:执行key对应的动画
- removeAllAnimations:删除该CALayer上添加的所有动画
- removeAnimationForKey: 删除key对应的动画
- animationKeys:获取所有动画key组成的数组
- presentationLayer:获取calayer的表现层
- 对于presentationLayer,这个属性不一定总会返回一个实体对象,只有当进行动画或者其他渲染的操作时,这个属性会返回一个在当前屏幕上的layer
- 并且每一次执行,这个对象都会不同,它是原layer的一个副本
- 可以用来获取当前动画的改变中属性的实时值
二。相关类
- CAAnimation :所有动画类的基类
- 实现CAMediaTiming协议,提供了动画的持续时间 、速度和重复计数
- 实现CAAction协议,为动画触发的动画提供标准化响应
- CATransition
- 可通过预设的过渡效果来控制CALayer层的过渡效果。
- CAPropertyAnimation(CABasicAnimation 和 CAKeyframeAnimation 的父类)
- 代表属性动画。 可以通过 animationWithKeyPath: 类方法来创建属性动画实例。
- CABasicAnimation
- 简单控制CALayer层的属性慢慢变化。
- CAKeyframeAnimation
- 支持
关键帧
的属性动画,该动画最大的特点在于可通过values属性指定多个关键帧,通过多个关键帧可以指定动画的各阶段的关键值。
- 支持
- CAAnimationGroup
- 用于将 多个动画组合在一起执行。
继承关系图:
三。 CAAnimation 提供的属性和方法
CAAnimation 提供的属性和方法
- removedOnCompletion:该属性用于指定该动画完成时是否从目标CALayer上删除该动画
- timingFunction: 该属性用于指定一个CAMediaTimingFunction对象,该对象负责控制动画变化的步长。
- animationDidStart:(CAAnimation*)theAnimation: 该动画开始时将会调用
- animationDidStop:(CAAnimation*)theAnimation finished:(BOOL)flag: 该动画结束时会调用
CAMediaTiming:提供的属性和方法
- duration: 动画继续时间,默认0
- repeatCount: 动画重复次数 默认0
- fillMode: 决定当前对象在非active时间段的行为.比如动画开始之前,动画结束之后,有四个值:
- kCAFillModeForwards:当动画结束后,layer会一直保持着动画最后的状态
- kCAFillModeBackwards:就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始
- kCAFillModeBoth:动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.
- kCAFillModeRemoved :这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
注意:如果是一个动画CAAnimation,则需要将其removedOnCompletion设置为NO,要不然fillMode不起作用.
四。 CATransition控制过渡动画
type
属性用于控制动画类型- KCATransitionFade:渐隐效果(默认)
- KCATransitionMoveIn:移入动画
- KCATransitionPush:推入动画
- KCATransitionReveal:揭开动画
- cube :立方体旋转
- suckEffect :收缩动画
- oglFlip :翻转
- rippleEffect : 水波
- pageCurl : 页面揭开
- pageUnCurl :放下页面
- cameraIrisHollowOpen : 镜头打开动画
- cameraIrisHollowClose : 镜头关闭
subyte
属性用于指定动画的移动方向- kCATransitionFromRight
- kCATransitionFromLeft
- kCATransitionFromTop
- kCATransitionFromBottom
startProgress
和endProgress
控制动画开始和结束的时间
示例:(移入动画)
CATransition *transition = [CATransition animation];
transition.duration = 2.0f;
// 使用kCATransitionMoveIn动画
transition.type = kCATransitionMoveIn;
// 指定动画方向,从左向右
transition.subtype = kCATransitionFromLeft;
[self.view.layer addAnimation:transition forKey:@"animation"];
五。 属性动画(CABasicAnimation、CAKeyframeAnimation)
CAPropertyAnimation 提供的属性以及方法
- animationWithKeyPath: 根据参数指定的CALayer属性来进行动画
5.1 CABasicAnimation
CABasicAnimation 提供的属性方法
- fromValue、toValue:分别指定动画属性开始时的属性值和动画属性结束时的属性值
示例:改变背景颜色
CABasicAnimation* cocorAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
CGColorRef beforeColor = self.notiScanLabel.layer.backgroundColor;
CGColorRef afterColor = c.CGColor;
cocorAnimation.fromValue = (__bridge id)beforeColor;
cocorAnimation.toValue = (__bridge id)afterColor;
cocorAnimation.duration = 0.8;
cocorAnimation.removedOnCompletion = true;
cocorAnimation.fillMode = kCAFillModeForwards;
[self.notiScanLabel.layer addAnimation:cocorAnimation forKey:@"cocorAnimation"];
5.2 CAKeyframeAnimation
CAKeyframeAnimation提供的属性方法
- values : 可以指定动画过程中的多个值
示例:改变位置
CAKeyframeAnimation *shakeAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
shakeAnim.values = [NSArray arrayWithObjects:
[NSValue valueWithCGPoint: position1],
[NSValue valueWithCGPoint: position2],
[NSValue valueWithCGPoint:self.layer.position],nil];
shakeAnim.duration = totalInterval ;
[self.someview addAnimation: shakeAnim forKey:@"shakeAnim"];