所以你很好,你已經弄清楚了這裏的事情,但你對自己的問題的答案有一些不準確的地方。讓我糾正幾件事:
框架屬性可以被動畫 - 只是沒有顯式動畫。如果您做以下不是一個視圖的根層的層,框架將動畫就好了:
[CATransaction begin];
[CATransaction setAnimationDuration:2.0f];
[animationLayer setFrame:CGRectMake(100.0f, 100.0f, 100.0f, 100.0f)];
[CATransaction commit];
記住一個層上設置屬性將動畫默認該屬性的變化。事實上,如果你不想讓它動起來,你必須禁用屬性更改的動畫。 (當然,這隻有在您爲視圖的根層以外的其他圖層設置動畫時纔是如此。)如果您需要使用顯式動畫,則在動畫設置位置和邊界時是正確的。
您使用隱式動畫可以動畫上一個UIView幀:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:3.0f];
[[self view] setFrame:CGRectMake(45.0f, 45.0f, 100.0f, 100.0f)];
[UIView commitAnimations];
這將從該視圖的當前幀的動畫(邊界和位置)至x = 45.0,Y = 45.0,W = 100.0 ,h = 100.0。
看來你也可能會誤解動畫和圖層之間的區別。您將動畫添加到圖層,但向圖層添加動畫不會自動設置您正在動畫的屬性。
CALayers是模型對象。它們包含關於最終渲染到屏幕的圖層的信息。如果您希望該屬性實際上具有該值,則您必須必須設置圖層的屬性。如果您只是爲屬性設置動畫效果,那麼它只會是一種可視化表示,而不是實際的 - 也就是說,這就是爲什麼值會快速恢復到圖層的原始值,因爲您從未真正改變過它。
這導致我到下一個點。你說:
使用 「animation.removedOnCompletion = NO; animation.fillMode = kCAFillModeForwards;」確保 值不會在動畫
這結束 reseted是不完全正確的。這兩個值只是簡單地使動畫保持在最終位置可視,但是,該圖層的實際值沒有改變。它們仍然與開始動畫時的值完全相同。一般情況下(除少數例外),您不想使用這兩個參數,因爲它們只是只可視爲。你想要的是實際設置你的動畫屬性的圖層值。
舉例來說,你想要使用明確的動畫來動畫你的圖層的位置。這裏是你想要的代碼:
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
[animation setFromValue:[NSValue valueWithCGPoint:CGPointMake(70.0f, 70.0f)]];
[animation setToValue:[NSValue valueWithCGPoint:CGPointMake(150.0f, 150.0f)]];
[animation setDuration:2.0f];
// Actually set the position on the *layer* that you want it to be
// when the animation finishes.
[animationLayer setPosition:CGPointMake(150.0f, 150.0f)];
// Add the animation for the position key to ensure that you
// override the animation for position changes with your animation.
[animationLayer addAnimation:animation forKey:@"position"];
你可能還想考慮動畫分組。通過動畫組,您可以將多個動畫組合在一起,然後控制它們之間的相互關係。在你的情況下,你的界限和位置動畫的持續時間是相同的,所以你試圖做的沒有一個組會工作得很好,但是如果你想抵消動畫的開始,例如你不想要位置動畫開始,直到第二個或第二個進入框架動畫,您可以通過設置beginTime位置動畫的值來錯開它們。
最後,我很想知道爲什麼你不能使用UIView提供的隱式動畫。我在絕大多數我寫的Core Animation代碼中使用這些代碼,並且無法明白爲什麼這不適合您的情況。
此致敬禮。
感謝您的解釋馬特。但對於UIView動畫問題,它僅與我的圖層有關。通常,我使用UIView的動畫沒有問題,但在我的情況下,它造成了奇怪的行爲。調整視圖框的大小並不會調整iPhone的圖層大小(因爲iPhone上沒有自動機制,僅適用於視圖和子視圖)。所以,你必須「手動」。 – Sauleil 2010-07-21 14:00:14
好的答案!很詳細。如果可以的話,我會給你2分。 – Soberman 2016-01-18 22:26:12