在头文件声明:CALayer *logoLayer
//界限 CABasicAnimation *boundsAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"]; boundsAnimation.fromValue = [NSValue valueWithCGRect: logoLayer.bounds]; boundsAnimation.toValue = [NSValue valueWithCGRect:CGRectZero]; //透明度变化 CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; opacityAnimation.fromValue = [NSNumber numberWithFloat:1.0]; opacityAnimation.toValue = [NSNumber numberWithFloat:0.5]; //位置移动 CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; animation.fromValue = [NSValue valueWithCGPoint: logoLayer.position]; CGPoint toPoint = logoLayer.position; toPoint.x += 180; animation.toValue = [NSValue valueWithCGPoint:toPoint]; //旋转动画 CABasicAnimation* rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];//"z"还可以是“x”“y”,表示沿z轴旋转 rotationAnimation.toValue = [NSNumber numberWithFloat:(2 * M_PI) * 3]; // 3 is the number of 360 degree rotations // Make the rotation animation duration slightly less than the other animations to give it the feel // that it pauses at its largest scale value rotationAnimation.duration = 2.0f; rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; //缓入缓出 //缩放动画 CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; scaleAnimation.fromValue = [NSNumber numberWithFloat:0.0]; scaleAnimation.toValue = [NSNumber numberWithFloat:1.0]; scaleAnimation.duration = 2.0f; scaleAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; //将上述两个动画编组 CAAnimationGroup *animationGroup = [CAAnimationGroup animation]; animationGroup.duration = 2.0f; animationGroup.autoreverses = YES; //是否重播,原动画的倒播 animationGroup.repeatCount = NSNotFound;//HUGE_VALF; //HUGE_VALF,源自math.h [animationGroup setAnimations:[NSArray arrayWithObjects:rotationAnimation, scaleAnimation, nil]]; [logoLayer addAnimation:animationGroup forKey:@"animationGroup"]; //去掉所有动画 [logoLayer removeAllAnimations]; //去掉key动画 [logoLayer removeAnimationForKey:@"animationGroup"];
如何能够到一个动画完成之后运行另一个 CABasicAnimation?(也就是按顺序执行动画)
开始我使用的是下面的方法:添加第二个动画的开始时间;但结果第二个动画没执行。
CABasicAnimation * appearance =[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; appearance.duration = 0.5; appearance.fromValue = [NSNumber numberWithFloat:0]; appearance.toValue = [NSNumber numberWithFloat:340]; appearance.repeatCount = 1; appearance.fillMode = kCAFillModeForwards; appearance.removedOnCompletion = NO; [notif.layer addAnimation:appearance forKey:@"transform.translation.y"]; CABasicAnimation * theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; theAnimation.duration = 0.5; theAnimation.fromValue = [NSNumber numberWithFloat:0]; theAnimation.toValue = [NSNumber numberWithFloat:10]; theAnimation.repeatCount = 3; theAnimation.autoreverses = YES; theAnimation.fillMode = kCAFillModeForwards; theAnimation.removedOnCompletion = NO; theAnimation.beginTime = appearance.beginTime + appearance.duration; [notif.layer addAnimation:theAnimation forKey:@"transform.translation.y"];
这个方法行不通之后我又换了另一个方法:
CABasicAnimation * appearance =[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; [appearance setValue:@"animation1" forKey:@"id"]; appearance.delegate = self; [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:)]; appearance.duration = 0.5; appearance.fromValue = [NSNumber numberWithFloat:0]; appearance.toValue = [NSNumber numberWithFloat:340]; appearance.repeatCount = 1; appearance.fillMode = kCAFillModeForwards; appearance.removedOnCompletion = NO; [notif.layer addAnimation:appearance forKey:@"transform.translation.y"];
- (void)animationDidStop:(CAAnimation *)theAnimation2 finished:(BOOL)flag { if([[theAnimation2 valueForKey:@"id"] isEqual:@"animation1"]) { CABasicAnimation * theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; theAnimation.duration = 0.5; theAnimation.fromValue = [NSNumber numberWithFloat:0]; theAnimation.toValue = [NSNumber numberWithFloat:10]; theAnimation.repeatCount = 3; theAnimation.autoreverses = YES; theAnimation.fillMode = kCAFillModeForwards; theAnimation.removedOnCompletion = NO; theAnimation.beginTime = appearance.beginTime + appearance.duration; [notif.layer addAnimation:theAnimation forKey:@"transform.translation.y"]; } }