我正在使用此变换在动画块中应用旋转变换动画:
CATransform3D rotatedTransform = self.layer.transform;
rotatedTransform = CATransform3DRotate(rotatedTransform, 90 * M_PI / 180.0, 0.0f, 0.0f, 1.0f);
self.layer.transform = rotatedTransform;
动画开始,用户开始另一个必须将旋转推向新目标的事件。为了计算逼真的行为,我需要知道旋转的当前程度是什么,以便可以适当地加上下一个旋转度。
答案 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));