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

Posted

技术标签:

【中文标题】如何使用 CAKeyFrameAnimation 继续旋转视图?【英文标题】:How to keep on rotating a view with a CAKeyFrameAnimation? 【发布时间】:2010-02-02 15:10:51 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

您可以使用我在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 反映了动画中间层的当前状态。

【讨论】:

以上是关于如何使用 CAKeyFrameAnimation 继续旋转视图?的主要内容,如果未能解决你的问题,请参考以下文章

CAKeyframeAnimation 完成时如何指定选择器?

如何在 Iphone 中停止 CAKeyFrameAnimation

如何同步几个不同图层的 CAKeyframeAnimation 动画?

如何获取CAKeyframeAnimation对象的当前屏幕xy位置?

iOS - CAKeyFrameAnimation - 未播放

为啥我不能使用 CAKeyframeAnimation 在 eulerAngle 上为 SCNnode 设置动画