2

给出以下代码:

self.transform = CGAffineTransformRotate(self.transform, ?);

有没有办法在不知道当前旋转角度的情况下将旋转设置回 0?我有其他想要维护的转换,因此我使用CGAffineTransformRotate而不是CGAffineTransformMakeRotation.

4

2 回答 2

3

如果只是缩放和旋转,那么您的选择实际上是(i)仅确定比例并制作该比例的全新缩放矩阵;或(ii)按照您的建议,确定旋转并将您的变换调整相反的量。

您可以通过查看变换矩阵的组件来实现。如果您考虑矩阵乘法的工作原理,您会得到输出 x 轴(transform.a, transform.b)和输出 y 轴(transform.c, transform.d)

因此,对于 (i):

// use the Pythagorean theorem to get the length of either axis;
// that's the scale, e.g.
CGFloat scale = sqrtf(
          self.transform.a*self.transform.a + 
          self.transform.b*self.transform.b);

self.transform = CGAffineTransformMakeScale(scale, scale);

对于 (ii):

// use arctan to get the rotation of the x axis
CGFloat angle = atan2f(
          self.transform.b*self.transform.b, self.transform.b*self.transform.a);

self.transform = CGAffineTransformRotate(self.transform, -angle);
于 2013-01-17T04:13:08.240 回答
0

你也可以反转变换

CGAffineTransform CGAffineTransformInvert (
   CGAffineTransform t
);

例如

self.transform = CGAffineTransformInvert(CGAffineTransformRotate(self.transform, -angle));
于 2013-01-30T23:09:27.710 回答