CGAffineTransformRotate和M_-PI不一致(目标C,iOS)

CGAffineTransformRotate和M_-PI不一致(目标C,iOS),ios,objective-c,rotation,cgaffinetransform,Ios,Objective C,Rotation,Cgaffinetransform,我试着在Objective-C中做简单的旋转,一开始就有几个问题。一件事是我从中得到的不一致性,以及在该函数中使用M_PI时是如何不一致的 假设我这样做,并将其连接到一个按钮上。当我按下它一次时,它将逆时针旋转180度(很好,遵循文档),但当我再次按下它时,它将顺时针旋转180度,即使该值不是负值。将M_PI更改为-M_PI执行完全相同的操作,且旋转没有差异: [UIView animateWithDuration:secs delay:0.0 options:option animati

我试着在Objective-C中做简单的旋转,一开始就有几个问题。一件事是我从中得到的不一致性,以及在该函数中使用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度以上的物体,行为就是旋转最短的路径,即使我指定了正旋转或负旋转。当我旋转360度(2PI)时,它甚至不旋转

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

问题是,在使用animateWithDuration时,无法真正控制旋转方向。它总是走最短的路线。当旋转180度时,由于理论上存在两种最短路径的可能性,因此行为尚未确定。这也解释了为什么旋转角度不能超过180度。如果你想对动画有更多的控制,或者做更复杂的动画,请使用CAKeyframeAnimation。

正如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)
  {
  }

}

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

为什么旋转pi/2(90)会将其旋转到3pi/2(270)的相反方向。