有没有办法弄清楚,在动画中当前旋转视图的度数?

Tha*_*nks 7 iphone core-animation

我正在使用此变换在动画块中应用旋转变换动画:

CATransform3D rotatedTransform = self.layer.transform;
rotatedTransform = CATransform3DRotate(rotatedTransform, 90 * M_PI / 180.0, 0.0f, 0.0f, 1.0f);
self.layer.transform = rotatedTransform;
Run Code Online (Sandbox Code Playgroud)

动画开始,用户开始另一个必须将旋转推向新目标的事件.为了计算逼真的行为,我需要知道旋转的当前程度是什么,以便可以适当地加上下一个旋转度.

小智 27

这是一个老问题但我在尝试在关键帧动画期间找到当前旋转角度时遇到了这个答案: -

CALayer* layer = [self.layer presentationLayer];
float currentAngle = [[layer valueForKeyPath:@"transform.rotation.z"] floatValue];
Run Code Online (Sandbox Code Playgroud)

似乎为我工作.而且,简洁明了.

  • 完善.简洁.这应该被接受作为问题的答案. (2认同)

Bra*_*son 4

您可以通过获取动画层的presentationLayer 来检索其当前状态。假设您没有对图层应用任何其他变换,您可以使用如下代码提取旋转图层的当前角度:

CATransform3D rotationTransform = [(CALayer *)[self.layer presentationLayer] 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;
Run Code Online (Sandbox Code Playgroud)

在未经修改的变换中,m11 和 m12 值是位于单位圆上的坐标,因此您可以使用三角学来确定它们描述的角度。

编辑(2009 年 5 月 18 日):向 CALayer 添加了类型转换以克服编译器警告,并修复了三角运算中变换的命名。