2009-02-12 165 views
28

我正在寫一個iPhone應用程序,並且我有一張我想要向外旋轉的圖像。我可以使用CGAffineTransformMakeRotation旋轉視角超過360度嗎?

目前我的代碼看起來像這樣(包裹在beginAnimations/commitAnimations塊):

scale = CGAffineTransformScale(CGAffineTransformIdentity, 5.0f, 5.0f); 
swirl = CGAffineTransformRotate(scale, M_PI); 
[player setTransform:swirl];  
[player setAlpha:0.0f]; 

但我發現,如果我試圖改變旋轉的,比如說角度,4 * M_PI,它根本不旋轉。是否可以使用CGAffineTransformRotate獲得720˚的旋轉,還是必須切換到其他技術?

如果我不得不切換到另一種技術,你會推薦使用另一個線程(或計時器)來自己做動畫,還是OpenGL會是更好的路線?

謝謝,
布萊克。

回答

64

無論旋轉角度小於一個完整旋轉角度還是旋轉角度的許多倍數,您都可以將視圖旋轉一定數量的弧度,而無需將旋轉分割爲多個部分。作爲一個例子,下面的代碼會在一個指定的秒數內旋轉一個視圖,每秒一次。您可以輕鬆修改它以旋轉一定數量的旋轉視圖,或旋轉一定數量的弧度。

- (void) runSpinAnimationWithDuration:(CGFloat) duration; 
{ 
    CABasicAnimation* rotationAnimation; 
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
    rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ]; 
    rotationAnimation.duration = duration; 
    rotationAnimation.cumulative = YES; 
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 

    [myView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
} 
5

你可以,但你需要將你的動畫分成半圓旋轉。我提供了一個例子來回應this question,使用重複的CABasicAnimation應用於視圖下的圖層。正如我在那裏所建議的那樣,將這些半旋轉作爲CAKeyframeAnimation的組成部分可能是更好的方式來構造它,因爲動畫會更平滑(在我的示例中,在半旋轉之間有輕微的障礙),並且您可以在開始和結束時有一個很好的加速/減速。

+0

很酷。這似乎正在做我所希望的,而且我想我也可以爲它添加縮放轉換,並自行獲取通知給我的課程。 謝謝! – bwinton 2009-02-12 21:02:10

+2

說你必須將動畫分成半圈旋轉是不正確的。看到我的答案。 – mahboudz 2009-09-14 19:29:37

+0

如果您依賴CATransform3D作爲您正在動畫的值,那麼確實如此。我沒有想過你的方法,使用核心動畫爲變換結構字段提供的關鍵路徑擴展。你是對的,這可能是一個更清晰的方法來解決這個問題。 – 2009-09-14 21:36:21

5

對標題的回答:是的,CGAffineTransform可以旋轉360度以上。
對問題的回答:是的,但無法爲其設置動畫,因爲沒有任何動畫。

請記住the affine transformation is a matrix,並且旋轉矩陣包含預計算的的正弦和餘弦值。這是因爲如果你說:

CGFloat angle = 4.0 * M_PI; 
NSAffineTransformStruct matrix = { 
    .m11 = cos(angle), 
    .m12 = sin(angle), 
    .m21 = -sin(angle), 
    .m22 = cos(angle), 
    .tx = 0.0, 
    .ty = 0.0 
}; 
NSAffineTransform *transform = [NSAffineTransform transform]; 
[transform setTransformStruct:matrix]; 

現在,讓我們來回顧一些樣本值cossin

  • cos(0π) = 1
  • sin(0π) = 0
  • cos(2π) = 1
  • sin(2π) = 0
  • cos(4π) = 1
  • sin(4π) = 0

記住,基質不包含角 - 它僅包含餘弦和正弦。而且這些值不會從一個圓圈變成另一個圓圈。因此,沒有任何動畫。

(請注意,Calculator.app給出了COS(xπ)和sin(xπ)錯誤的結果。嘗試繪圖器,calc,或Google。)

您需要將動畫分割成一個圓圈分數。 Brad Larson建議的半圈將會很好。