1

我尝试这样做:有一个视图已经旋转到某个值,比如说 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"];
4

2 回答 2

1

您可以使用theLayer.transformortheLayer.affineTransform获取当前的变换矩阵(在动画之前),然后使用iphone sdk CGAffineTransform 获取对象的旋转角度来获取开始的角度。

于 2010-02-02T16:01:52.073 回答
0

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

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;

或使用此处建议的更简单的辅助 keypath 方法:

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

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

于 2010-02-02T19:33:02.933 回答