CGAffineTransformRotate和M_PI不一致(Objective-C,iOS)

时间:2012-10-08 17:56:29

标签: ios objective-c rotation cgaffinetransform

我正在尝试在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度。

2 个答案:

答案 0 :(得分:11)

问题是使用animateWithDuration时无法真正控制旋转方向。它总是采用最短的路线。当旋转180度时,行为是不确定的,因为理论上最短路线有两种可能性。这也解释了为什么你不能旋转180度以上。如果您想要更好地控制动画或执行更复杂的动画,请使用CAKeyframeAnimation。

答案 1 :(得分: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)
  {
  }

}

];

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