簡體   English   中英

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

[英]CGAffineTransformRotate and M_PI inconsistencies (Objective-C, iOS)

我正在嘗試在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度的東西。

問題是使用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)
  {
  }

}

];

此代碼未經過測試,因此如果出現問題,請嘗試使用它。 希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM