CABasicAnimation *rotationAnimation;
//围绕Z轴旋转
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
//改变属性的起始值
rotationAnimation.fromValue = [NSNumber numberWithFloat:0];
//改变属性的结束值
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 ];
//动画时长
rotationAnimation.duration = 5.0f;
rotationAnimation.cumulative = YES;
//重复次数
rotationAnimation.repeatCount = 1;
//防止动画结束后回到初始状态
rotationAnimation.removedOnCompletion = NO;
rotationAnimation.fillMode = kCAFillModeForwards;
//添加动画
[self.scanImgView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
动画开始和结束时的事件
为了获取动画的开始和结束事件,需要实现协议
positionAnima.delegate = self;
代理方法实现
其实比较重要的是有多个动画的时候如何在代理方法中区分不同的动画 两种方式
方式一:
如果我们添加动画的视图是全局变量,可使用该方法。
添加动画时,我们使用了
[self.imageView.layer addAnimation:animaGroup forKey:@"Animation"];
所以,可根据key来区分不同的动画
//动画开始时
- (void)animationDidStart:(CAAnimation *)anim
{
if ([anim isEqual:[self.imageView.layer animationForKey:@"Animation"]]) {
NSLog(@"动画组执行了");
}
}
Note:把动画存储为一个属性然后再回调中比较,用来判定是哪个动画是不可行的。应为委托传入的动画参数是原始值的一个深拷贝,不是同一个值
方式二
添加动画的视图是局部变量时,可使用该方法
添加动画给动画设置key-value对
[positionAnima setValue:@"PositionAnima" forKey:@"AnimationKey"];
[transformAnima setValue:@"TransformAnima" forKey:@"AnimationKey"];
所以,可以根据key中不同的值来进行区分不同的动画
//动画结束时
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
if ([[anim valueForKey:@"AnimationKey"]isEqualToString:@"PositionAnima"]) {
NSLog(@"位置移动动画执行结束");
}
else if ([[anim valueForKey:@"AnimationKey"]isEqualToString:@"TransformAnima"]){
NSLog(@"旋转动画执行结束");
}
}