我们知道,Layer层中可以设置许多与控件UI相关的属性,并且对于iOS开发,UIView层的属性是会映射到CALayer的,因此可以通过UIKit和CoreAnimation两个框架来设置控件的UI相关属性,当属性发生变化时,我们可以使其展示一个动画效果。
CAAnimation是CoreAnimation框架中执行动画对象的基类。如下图就描述了CoreAnimation框架中的一些类的关系。
image.png
从上图中我们可以看到,从CAAnimation中继承出了三个子类,分包是用于创建属性动画的CAPropertyAnimation,创建转场动画的CATransition和创建组合动画的CAAnimationGroup。
1、CAAnimation
作为动画对象的基类,CAAnimation中封装了动画的基础属性,如下:
/* 通过类方法创建一个CAAnimation对象 */
+ (instancetype)animation;
/* 动画执行的时序模式
kCAMediaTimingFunctionLinear//线性执行
kCAMediaTimingFunctionEaseIn//淡入,在动画开始时的淡入效果
kCAMediaTimingFunctionEaseOut//淡出,在动画结束时的淡出效果
kCAMediaTimingFunctionEaseInEaseOut//淡入、淡出
kCAMediaTimingFunctionDefault//默认效果
*/
@property(nullable, strong) CAMediaTimingFunction *timingFunction;
/* 是否在动画完成时将动画对象移除,默认是YES */
@property(getter=isRemovedOnCompletion) BOOL removedOnCompletion;
/* 代理*/
@property(nullable, strong) id <CAAnimationDelegate> delegate;
//代理方法如下:
/*在动画开始时执行的回调*/
- (void)animationDidStart:(CAAnimation *)anim;
/*在动画结束后执行的回调*/
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
2、CAPropertyAnimation
CAPropertyAnimation是继承于CAAnimation,专门用来创建与属性相关的动画类。
/*创建对象,参数中的path就是我们要传入的动画属性
例如如果传入@“backgroundColor”,则当Layer的背景颜色改变时,就会执行我们设置的动画
*/
+ (instancetype)animationWithKeyPath:(nullable NSString *)path;
@property(nullable, copy) NSString *keyPath;
/*这个属性确定动画执行的状态是否叠加在控件的原状态上
默认为NO,如果我们执行两次位置移动的动画,则会从同一位置执行两次
如果设置为YES,则会在第一次执行的基础上执行第二次动画
*/
@property(getter=isAdditive) BOOL additive;
/*这个属性对重复执行的动画有效果
默认NO,重复执行的动画每次都是从起始状态开始的
如果设置为YES,则每次执行都会在上一次执行的基础上执行
*/
@property(getter=isCumulative) BOOL cumulative;
/*这个属性和transform属性的动画执行相关*/
@property(nullable, strong) CAValueFunction *valueFunction;
在上面的属性中,我们需要注意,valueFunction是专门为了transform动画而设置的,因为我们没有办法直接改变tran3D中的属性,通过这个参数,我们可以直接操作tran3D属性变化产生动画效果。下面就是一个围绕z轴旋转的动画:
- (void)addAnimalForZTransform {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
//设置Z轴旋转
animation.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionTranslateZ];
//我们也可以直接设置
// CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
//从0度开始
animation.fromValue = @0;
//选择到180度
animation.toValue = [NSNumber numberWithFloat:M_PI];
//时长
animation.duration = 2;
//执行动画
[self.view.layer addAnimation:animation forKey:@""];
}
3、CAKeyframeAnimation
CABasicAnimation是CAPropertyAnimation分出来的一个子类,只能设置初始和结束状态,之间的变化我们没法控制,而CAKeyframeAnimation可以让我们在整个动画的过程中设置一些关键帧。
- (void)addAnimationForKeyFrame {
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
//关键帧的值数组,例如我们想让控件沿着某个路径移动,这里面存放每个移动点
animation.values = @[[NSValue valueWithCGPoint:CGPointMake(100, 100)],[NSValue valueWithCGPoint:CGPointMake(120, 100)],[NSValue valueWithCGPoint:CGPointMake(120, 200)],[NSValue valueWithCGPoint:CGPointMake(200, 200)]];
//设置每一帧执行的时间长短,取值0~1,代表占用时间的比例
animation.keyTimes = @[@0.1,@0.3,@0.5,@0.1];
//每一帧执行过程中的时序效果
animation.timingFunctions = @[kCAMediaTimingFunctionEaseIn,kCAMediaTimingFunctionEaseInEaseOut,kCAMediaTimingFunctionEaseInEaseOut,kCAMediaTimingFunctionEaseOut];
animation.duration = 3;
[self.view.layer addAnimation:animation forKey:@""];
}
4、CASpringAnimation
通过CASpringAnimation,我们可以很轻松的创建出有弹簧效果的动画,其主要属性如下:
/* 设置弹簧重物的质量,会影响惯性,必须大于0,默认为1*/
@property CGFloat mass;
/* 设置弹簧的刚度系数,必须大于0,默认为100,这个值越大,则回弹越快 */
@property CGFloat stiffness;
/* 阻尼系数,默认为10,必须大于0,这个值越大,则回弹的幅度越小 */
@property CGFloat damping;
/* 初始速度 */
@property CGFloat initialVelocity;
/* 获取动画停下来需要的时间*/
@property(readonly) CFTimeInterval settlingDuration;
5、CATransition
CATransition常被称为转场动画,和CAPropertyAnimation的不同之处在于当Layer层出现时,而并不是属性改变时,其会产生动画效果。
6、CAAnimationGroup
CAAnimationGroup本身并没有定义动画,他可以将我们上面提到的相关动画进行组合。
网友评论