4

我正在尝试在 Objective-C 中进行简单的旋转,但马上就有几个问题。一件事是我从CGAffineTransformRotate得到的不一致以及在该函数内部使用时 M_PI 是如何不一致的。

假设我这样做,并将其附加到按钮上。当我按下它一次它会逆时针旋转 180 度(很好并且遵循文档)但是当我再次按下它时,它会顺时针旋转 180 度,即使该值不是负数。将 M_PI 更改为 -M_PI 执行完全相同的操作,而旋转没有差异:

[UIView animateWithDuration:secs delay:0.0 options:option
   animations:^{
      self.transform = CGAffineTransformRotate(self.transform, M_PI);   //Inconsistent
} completion:nil];

现在假设我将 M_PI 更改为 3.141593,这是我打印时 M_PI 包含的值。现在,当我按下按钮时,它完全可以正常工作。两次,它都会逆时针旋转 180 度。当我将其更改为 -3.141593 时,它也会完全正常工作,顺时针方向:

self.transform = CGAffineTransformRotate(self.transform, 3.141593);   //Works

当我更多地玩它时,行为变得更加奇怪。

假设我想旋转 90 度 (pi/2)。M_PI 现在具有与使用值相同的行为,但旋转与应有的相反:

//Should be Clockwise but rotates CounterClockwise
self.transform = CGAffineTransformRotate(self.transform, -M_PI/2);  
self.transform = CGAffineTransformRotate(self.transform, -1.5707965); 

//Should be CounterClockwise but rotates Clockwise
self.transform = CGAffineTransformRotate(self.transform, M_PI/2);  
self.transform = CGAffineTransformRotate(self.transform, 1.5707965);

如果我想旋转任何超过 180 度 (PI) 的东西,即使我指定了正旋转或负旋转,行为也只是旋转最短路径。当我旋转 360 度 (2PI) 时,它甚至不旋转。

为什么会发生这些事情,我该怎么做才能使其更加一致?我的第二个问题是如何将事物旋转 270 度和 360 度。

4

2 回答 2

11

问题是使用 animateWithDuration 时无法真正控制旋转方向。它总是走最短的路线。当旋转 180 度时,行为是不确定的,因为理论上最短路线有 2 种可能性。这也解释了为什么不能旋转超过 180 度。如果您想对动画进行更多控制或制作更复杂的动画,请使用 CAKeyframeAnimation。

于 2012-10-08T21:14:21.187 回答
0

正如phix23所说:总是走最短的路线。因此,您可以通过使用此技巧来避免这种情况,例如顺时针整圈:您必须将圆圈划分为例如 3 个控制点:

[UIView animateWithDuration:secs delay:0.0 options:UIViewAnimationOptionCurveLinear
animations:^{
   self.transform = CGAffineTransformRotate(self.transform, M_PI_2/3);   
} completion:(BOOL end)
{
       [UIView [UIView animateWithDuration:secs delay:0.0
                                   options:UIViewAnimationOptionCurveLinear
  animations:^{
      self.transform = CGAffineTransformRotate(self.transform, -M_PI_2/3);
  } completion:(BOOL end)
  {
  }

}

];

此代码未经测试,因此如果有问题,请尝试使用它。希望这会有所帮助。

于 2013-11-10T22:49:39.370 回答