CAAnimationGroup 不工作

Posted

技术标签:

【中文标题】CAAnimationGroup 不工作【英文标题】:CAAnimationGroup not working 【发布时间】:2012-07-13 07:34:20 【问题描述】:

CAAnimationGroup 有问题。我有一个名为animeView 的视图,我想同时应用围绕 Y 轴的 3D 旋转和缩放变换。旋转和缩放动画单独工作得非常好!但是当我将它们添加到 CAAnimationGroup 时,不会出现动画!

有什么问题?

CAKeyframeAnimation *rotation = [CAKeyframeAnimation animation];
CATransform3D rotationTransform = CATransform3DMakeRotation(M_PI, 0.0f, 1.0f, 0.0f);
rotationTransform.m34 = 1.0 / -500;

rotation.values = [NSArray arrayWithObjects:
                   [NSValue valueWithCATransform3D:CATransform3DMakeRotation(0.0f, 0.0f, 1.0f, 0.0f)],
                   [NSValue valueWithCATransform3D:rotationTransform],
                   [NSValue valueWithCATransform3D:CATransform3DMakeRotation(2.0*M_PI, 0.0f, 1.0f, 0.0f)] ,nil];

CAKeyframeAnimation *trans = [CAKeyframeAnimation animation];

trans.values = [NSArray arrayWithObjects:[NSValue valueWithCATransform3D:CATransform3DIdentity],[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 0.5)],[NSValue valueWithCATransform3D:CATransform3DIdentity], nil];

CAAnimationGroup *group = [CAAnimationGroup animation];

group.delegate = self;
[group setAnimations: [NSArray arrayWithObjects:rotation, trans, nil]];
group.duration = 2;
group.repeatCount = 3;

[self.animView.layer addAnimation:group forKey:nil];

【问题讨论】:

您永远不会设置动画的关键路径。此外,您不应为变换设置两次动画 这里我不懂 Key-Path。它像动画的标签吗?是否必须针对每种转换都有特定的内容? 顺便说一句,我没有动画变换两次。这些应该同时发生,这就是我使用 CAAnimationGroup 的原因! 但两者都在为变换设置动画(一个是旋转变换,另一个是缩放变换)。我的意思是在同一组中两次出现两次 【参考方案1】:

您提供的代码有两点奇怪。

    动画不知道他们应该改变什么属性(没有设置关键路径) 两个动画都在改变变换(应该真正使用什么值?)

我看到的方式是,您有两个具有相同数量值(三个)的变换关键帧动画。因此,您应该计算总变换矩阵(在一个矩阵中缩放和旋转),并且只将该动画添加到您的视图中。

它看起来像这样(我添加了很多 cmets 来解释 sis 发生了什么):

// Your first rotation is 0 degrees and no scaling
CATransform3D beginTransform = CATransform3DIdentity;

// Your middle rotation is the exact one that you provided ...
CATransform3D middleTransform = CATransform3DMakeRotation(M_PI, 0.0f, 1.0f, 0.0f);
// ... but the rotation matrix is then scaled as well ...
middleTransform = CATransform3DScale(middleTransform, 0.5, 0.5, 0.5);
// ... and the perspective is set
middleTransform.m34 = 1.0 / -500;

// Your end value is rotated but not scaled
CATransform3D endTransform = CATransform3DMakeRotation(2.0*M_PI, 0.0f, 1.0f, 0.0f);

// Create a new animation that should animate the "transform" property (thus the key path "transform")
CAKeyframeAnimation *rotateAndScale = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
// same configurations as your group had
[rotateAndScale setDuration:2.0];
[rotateAndScale setRepeatDuration:3.0];
[rotateAndScale setDelegate:self];
// Set the values of the transform animation (yes, both scaling and rotation in one animation)
[rotateAndScale setValues:[NSArray arrayWithObjects:
                           [NSValue valueWithCATransform3D:beginTransform], 
                           [NSValue valueWithCATransform3D:middleTransform], 
                           [NSValue valueWithCATransform3D:endTransform], nil]];

// Add the animation to the layer, no need for a group here...
[animView.layer addAnimation:rotateAndScale forKey:nil];

【讨论】:

以上是关于CAAnimationGroup 不工作的主要内容,如果未能解决你的问题,请参考以下文章

iOS 旋转动画在 CAAnimationGroup 中发生不顺畅

Unity即将内置骨骼动画插件Anima2D

CAAnimationGroup 中的 CAAnimation 委托

CAAnimationGroup 运行太快

核心动画 (CAAnimationGroup)

CAAnimationGroup 的最大持续时间值 (CFTimeInterval) 是多少?