2012-10-08 60 views
4

我正在嘗試在目標C中做簡單的旋轉,並且有一些問題立即解決。有一件事是我從CGAffineTransformRotate得到的不一致以及在該函數中使用M_PI時如何不一致。CGAffineTransformRotate和M_PI不一致(目標C,iOS)

假設我這樣做,並將其附加到按鈕。當我按下一次它會逆時針旋轉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度的東西。

謝謝。

回答

11

問題是,當使用animateWithDuration時,您無法真正控制旋轉方向。它將始終走最短的路線。當旋轉180度時,行爲是不確定的,因爲理論上最短路線有兩種可能性。這也解釋了爲什麼你不能旋轉超過180度。如果你想對動畫有更多的控制,或者更復雜的動畫使用CAKeyframeAnimation。

+0

爲什麼旋轉π/ 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) 
    { 
    } 

} 

]; 

此代碼並沒有進行測試,因此,如果有問題,嘗試玩用它。希望這會有所幫助。