使用CAAnimationGroup对两个核心动画进行分组会导致一个CABasicAnimation无法运行

时间:2010-01-22 19:55:43

标签: iphone core-animation

我有两个动画,我正在尝试使用OS 3.1.2在iPhone上的UILabel上执行。第一个来回摇晃UILabel:

CAKeyframeAnimation *rock;
rock = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
[rock setBeginTime:0.0f];
[rock setDuration:5.0];
[rock setRepeatCount:10000];

NSMutableArray *values = [NSMutableArray array];
MovingMath *math = [[MovingMath alloc] init];

// Center start position
[values addObject:[math DegreesToNumber:0]];

// Turn right
[values addObject:[math DegreesToNumber:-10]];

// Turn left
[values addObject:[math DegreesToNumber:10]];

// Re-center
[values addObject:[math DegreesToNumber:0]];

// Set the values for the animation
[rock setValues:values];

[math release];

第二个缩放UILabel以使其变大:

NSValue *value = nil;
CABasicAnimation *animation = nil;
CATransform3D transform;
animation = [CABasicAnimation animationWithKeyPath:@"transform"];
transform = CATransform3DMakeScale(3.5f, 3.5f, 1.0f);
value = [NSValue valueWithCATransform3D:transform];
[animation setToValue:value];
transform = CATransform3DMakeScale(1.0f, 1.0f, 1.0f);
value = [NSValue valueWithCATransform3D:transform];
[animation setFromValue:value];
[animation setAutoreverses:YES];
[animation setDuration:30.0f];
[animation setRepeatCount:10000];
[animation setBeginTime:0.0f];

将这些动画中的任何一个直接添加到UILabel的图层可以正常工作。

但是,如果我尝试将动画组合在一起,则第一个“摇摆”动画不起作用:

CAAnimationGroup *theGroup = [CAAnimationGroup animation];

theGroup.duration = 5.0;
theGroup.repeatCount = 10000;
theGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
theGroup.animations = [NSArray arrayWithObjects:[self rockAnimation], [self zoomAnimation], nil]; // you can add more

// Add the animation group to the layer
[[self layer] addAnimation:theGroup forKey:@"zoomAndRotate"];

将动画添加到群组的顺序无关紧要。我没有按照上面的方式进行缩放,而是尝试更改边界,但这也不成功。任何见解将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:8)

您正在尝试同时为两个属性设置动画,即CALayer的变换。在第一个动画中,您使用辅助键路径来更改变换以生成旋转,在第二个动画中,您将直接更改变换以生成缩放。第二个动画覆盖了第一个动画,因为你正在构建只有缩放并在它们之间制作动画的整个变换。

看起来您可以通过为两个动画使用辅助键路径来同时进行图层的缩放和旋转。如果您将缩放动画上的代码更改为

CABasicAnimation *animation = nil;
animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
[animation setToValue:[NSNumber numberWithDouble:3.5]];
[animation setFromValue:[NSNumber numberWithDouble:1.0]];
[animation setAutoreverses:YES];
[animation setDuration:30.0f];
[animation setRepeatCount:10000];
[animation setBeginTime:0.0f];

你应该能够在你的图层上进行摇摆和缩放。

答案 1 :(得分:2)

我相信CAAnimationGroup不是你想要的。来自CAAnimationGroup的文档:

  

CAAnimationGroup允许多个   要分组和运行的动画   同时。分组的动画   在由指定的时间空间中运行   CAAnimationGroup实例。

听起来你不希望你的动画同时运行,而是顺序运行。可能有更简单的方法来做到这一点,但我发现依赖animationDidStop:finished:方法很有效。为此,请创建第一个动画,并将其委托给将实现animationDidStop:finished:方法的对象,并正常添加动画(不使用CAAnimationGroup)。在方法中:

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
{
    // Create the second animation and add it
}