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

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度。
2个回答

11

问题在于使用animateWithDuration时无法真正控制旋转方向,它将始终选择最短的路线。当旋转180度时,其行为是不确定的,因为理论上存在两种最短路径的可能性。这也解释了为什么无法旋转超过180度。如果您想对动画进行更多控制或做更复杂的动画,请使用CAKeyframeAnimation。


为什么将其旋转π/2(90度)会使其以相反方向旋转到3π/2(270度)的位置? - FireDragonMule

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

}

];

这段代码没有经过测试,如果有问题,请尝试调整它。希望能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接