2011-04-26 28 views
1

我使用CGPathAddEllipseInRect繪製一個圓,然後在CAKeyframeAnimation中使用該圓。我的問題是動畫總是在同一個地方開始。我認爲我可以做到以下幾點與CGAffineTransform,使其在不同的角度入手:CGPathAddEllipseInRect中的transform屬性

CGAffineTransform temp = CGAffineTransformMakeRotation(M_PI/2); 
CGPathAddEllipseInRect(animationPath , &temp, rect); 

我不知道這是什麼做的。運行時,我甚至看不到動畫的這部分。它正在做一些離屏的事情。任何幫助理解這一點都會很棒。

回答

5

旋轉發生繞原點(0,0)在默認情況下,但要圍繞圓心旋轉,所以你必須做額外的轉換:

float midX = CGRectGetMidX(rect); 
float midY = CGRectGetMidY(rect); 
CGAffineTransform t = 
    CGAffineTransformConcat(
     CGAffineTransformConcat(
      CGAffineTransformMakeTranslation(-midX, -midY), 
      CGAffineTransformMakeRotation(angle)), 
     CGAffineTransformMakeTranslation(midX, midY)); 
CGPathAddEllipseInRect(animationPath, &t, rect); 

從本質上講,這個鏈條3轉換:首先,將圓移至原點(0,0),然後應用旋轉,然後將其移回其原始位置。我做了一個小的可視化來說明效果:

我選擇了一個正方形,而不是一個圓,45°,而不是90°,使旋轉更容易看到,但原理是一樣的。

+0

很好的答案 - 但你能否解釋一點。當你說起源時,我會認爲它是傳遞CGPathAddEllipseInRect的矩形的起源。但是,如果是這樣的話,那麼我仍然應該在屏幕上看到它,而這並沒有發生。如果它是屏幕的原點,那麼我假設我會看到它在屏幕的底部角落做四分之一的旋轉,這也沒有發生。當我在其中一個電話上登錄電話會議時,我得到了這個 - {{633.066,600.916},{40,40}}。這些圖層被隨機放置,這就是爲什麼這些座標看起來很有趣。 – Brian 2011-04-27 09:59:22

+0

另外,您能否解釋翻譯在代碼中的作用? – Brian 2011-04-27 10:07:41

+0

我已經爲我的答案添加了一些額外的解釋和可視化。希望這可以幫助。 – omz 2011-04-27 13:31:59

相關問題