有没有办法弄清楚当前动画中视图旋转了多少度?

时间:2009-05-18 11:09:39

标签: 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;

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

4 个答案:

答案 0 :(得分:27)

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

CALayer* layer = [self.layer presentationLayer];
float currentAngle = [[layer valueForKeyPath:@"transform.rotation.z"] floatValue];

似乎适合我。此外,简洁明了。

答案 1 :(得分: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;

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

EDIT(2009年5月18日):为CALayer添加了一个类型转换,以克服编译器警告并修复三角函数操作中变换的命名。

答案 2 :(得分:0)

您也可以使用矩阵和三角函数计算它。请参阅我的回答question

答案 3 :(得分:0)

试试这个:

CGFloat setAngle = 75.0;
CATransform3D t = CATransform3DIdentity;
t.m34 = 0.004;
t = CATransform3DRotate(t, -M_PI/180*setAngle, 0, 1, 0);
self.testView.layer.transform = t;

CGFloat getAngle = 0;
if (t.m11 < 0.0f) {
    getAngle = 180.0f - (asin(t.m13) * 180.0f / M_PI);
} else {
    getAngle = asin(t.m13) * 180.0f / M_PI;
}
NSLog(@"setAngle=%@ getAngle=%@", @(setAngle), @(getAngle));