使用 CAAnimationGroup 对两个核心动画进行分组会导致一个 CABasicAnimation 无法运行
Posted
技术标签:
【中文标题】使用 CAAnimationGroup 对两个核心动画进行分组会导致一个 CABasicAnimation 无法运行【英文标题】:Grouping two Core Animations with CAAnimationGroup causes one CABasicAnimation to not run 【发布时间】:2010-01-22 19:55:43 【问题描述】:我有两个动画,我试图在带有 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"];
将动画添加到组的顺序无关紧要。我没有以上述方式进行缩放,而是尝试更改边界,但这也没有成功。任何见解将不胜感激。谢谢。
【问题讨论】:
要注意我在下面的评论...我确实希望这些动画同时发生。问题是使用组时,rockAnimation 不运行;只有 zoomAnimation 运行。 【参考方案1】:您正试图同时为一个属性(即您的 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];
您应该能够在您的图层上同时进行摇摆和缩放。
【讨论】:
我遇到了完全相同的问题,但它在 iPad 3.2 上对我不起作用,我尝试访问旋转和缩放属性,但分组动画在几毫秒后立即停止,并且图层快速恢复!跨度> 【参考方案2】:我相信 CAAnimationGroup 不是你想要的。来自 CAAnimationGroup 的文档:
CAAnimationGroup 允许多个 要分组和运行的动画 同时。分组动画 在指定的时间空间内运行 CAAnimationGroup 实例。
听起来您不希望动画同时运行,而是按顺序运行。可能有更简单的方法可以做到这一点,但我发现依赖animationDidStop:finished:
方法效果很好。为此,创建您的第一个动画,并将它的委托设置为将实现animationDidStop:finished:
方法的对象,并正常添加动画(不使用 CAAnimationGroup)。方法中:
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
// Create the second animation and add it
【讨论】:
我确实希望这些同时发生。问题是使用组时,rockAnimation 不运行。只有 zoomAnimation 运行。 分组动画的持续时间不会缩放到它们的 CAAnimationGroup 的持续时间。相反,动画被剪辑到动画组的持续时间。您可能想尝试让所有动画在 5 秒内运行(并删除重复计数),看看是否是问题所在。以上是关于使用 CAAnimationGroup 对两个核心动画进行分组会导致一个 CABasicAnimation 无法运行的主要内容,如果未能解决你的问题,请参考以下文章
CAAnimationGroup 与 CAKeyframeAnimation 的优缺点
CAAnimationGroup 的最大持续时间值 (CFTimeInterval) 是多少?