ios的Core Animation 是基于CALayer,依赖CAAnimation类实现的。
CAAnimation分为以下几类
1.CABasicAnimation 基础动画
2.CAKeyframeAnimation 关键帧动画
3.CAAnimationGroup 动画组
分别说这几类。
CABasicAnimation使用方法是如下:
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale”];//比例缩放
animation.fromValue = [NSNumber numberWithFloat:1.0];
animation.toValue = [NSNumber numberWithFloat:2.0];
animation.autoreverses = YES;
animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;
animation.repeatCount = MAXFLOAT;
animation.duration = 1.0;
这个keypath的值很关键,它决定了动画在layer的那个属性上进行的。常用的还有以下属性,比如opacity透明度,position位置等。
fromValue代表动画的起始状态值,toValue代表动画结束状态值。
autoreverse 动画结束时是否执行逆动画
duration代表动画时长
removedOnCompletion和fillMode两个属性设置可以防止动画结束时回到原始状态
fillMode属性要生效,必须将removedOnCompletion的值设置为NO。
下面是fillMode各个值得含义:
kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态
kCAFillModeBackwards 这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态。因为有可能出现fromValue不是目前layer的初始状态的情况,如果fromValue就是layer当前的状态,则这个参数就没太大意义。
kCAFillModeBoth 理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.
CAAnimationGroup这个类可以同时执行多个动画,也就是组合动画
ABasicAnimation*positionAnima = [CABasicAnimationanimationWithKeyPath:@"position.y"];positionAnima.fromValue= @(self.imageView.center.y);positionAnima.toValue= @(self.imageView.center.y-30);positionAnima.timingFunction= [CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseIn];CABasicAnimation*transformAnima = [CABasicAnimationanimationWithKeyPath:@"transform.rotation.y"];transformAnima.fromValue= @(0);transformAnima.toValue= @(M_PI);transformAnima.timingFunction= [CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseInEaseOut];CAAnimationGroup*animaGroup = [CAAnimationGroupanimation];animaGroup.duration=2.0f;animaGroup.fillMode= kCAFillModeForwards;animaGroup.removedOnCompletion=NO;animaGroup.animations= @[positionAnima,transformAnima];[self.imageView.layeraddAnimation:animaGroup forKey:@"Animation"];
如果想获取动画结束事件,可以设置动画的代理,然后实现animationDidStart和animationDidStop方法即可