如何使用CAKeyFrameAnimation继续旋转视图?

时间:2010-02-02 15:10:52

标签: iphone core-animation cakeyframeanimation

我尝试这样做:有一个已经旋转到某个值的视图,比方说15度。

想象一个旋转了15度的视图。

接下来,我只知道,我希望此视图将从当前的旋转旋转到40度。

想象一下,这个视图现在如何从15度旋转到40度。

对于练习,我想用CAKeyFrameAnimation来做到这一点。但问题是,我所能做的就是从哪里到哪里都难以明确。 UIView动画没有方便的“拾取当前状态”的东西,对吧?我该怎么做呢?

另外,无论需要多少旋转量,我都想为该旋转指定3个关键帧。

想象一下,该视图如何从15度旋转到40度,使用3个关键帧来实现这一目标

但是另一个大问题:可能会发生另一个动画必须使用不同的目标。假设一个视图当前是从20度旋转到100度,并且在动画之间的某个地方,一个新的动画被踢,并希望该视图达到15度。使用UIView动画很简单。如何使用CAKeyFrameAnimation?

基本上我希望它的行为类似于UIView动画,它可以获取当前状态;)

CALayer* theLayer = rotatedView.layer;

CAKeyframeAnimation* animation;
animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];

animation.duration = 2;
animation.repeatCount = 1;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;

animation.values = [NSArray arrayWithObjects:
                    [NSNumber numberWithFloat:(10.0 / 180.0) * M_PI],
                    [NSNumber numberWithFloat:(20.0 / 180.0) * M_PI],
                    [NSNumber numberWithFloat:(30.0 / 180.0) * M_PI], nil];

[theLayer addAnimation:animation forKey:@"transform.rotation.z"];

2 个答案:

答案 0 :(得分:1)

您可以使用theLayer.transformtheLayer.affineTransform获取当前变换矩阵(在动画之前),然后使用iphone sdk CGAffineTransform getting the angle of rotation of an object来获取角度。

答案 1 :(得分:0)

您可以使用我在this answer中提供的代码获取用于设置动画的起始角度:

CATransform3D rotationTransform = [theLayer transform];
float angle;
if (rotationTransform.m11 < 0.0f)
        angle = 180.0f - (asin(rotationTransform.m12) * 180.0f / M_PI);
else
        angle = asin(rotationTransform.m12) * 180.0f / M_PI;

或使用更简单的帮助键路径方法suggested here

float currentAngle = ([[theLayer valueForKeyPath:@"transform.rotation.z"] floatValue] * 180.0f / M_PI);

如果要将此动画添加到正在进行的动画中,则需要直接查询theLayer的presentationLayer的当前角度,而不是theLayer。 CALayer的presentationLayer反映了动画中期动画的当前状态。