2009-09-04 163 views
39

我想創建一個正在下降的硬幣。硬幣圖像是CALayer上的2個CABasicAnimations - 一個掉下來和一個旋轉。當倒下的動畫結束時,它停留在那裏。雖然旋轉動畫應該是隨機的,並且每次都以不同的角度結束,但它仍會彈出原始CALAyer圖像。使用CABasicAnimation旋轉CALayer後,圖層跳回到它未旋轉的位置

我希望它保持在完成動畫的角度。可能嗎?我該怎麼做?

代碼:

//Moving down animation: 
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
anim.duration = 1; 
anim.autoreverses = NO; 
anim.removedOnCompletion = YES; 

anim.fromValue = [NSNumber numberWithInt: -80 - row_height * (8 - _col)]; 
anim.toValue = [NSNumber numberWithInt: 0]; 

//Rotation Animation: 
CABasicAnimation *rota = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 
rota.duration = 4; 
rota.autoreverses = NO; 
rota.removedOnCompletion = NO; 
rota.fromValue = [NSNumber numberWithFloat: 0]; 
rota.toValue = [NSNumber numberWithFloat: 2.5 * 3.15 ]; 
[cl addAnimation: rota forKey: @"rotation"]; 
[cl addAnimation: anim forKey: @"animateFalling"]; 

回答

79

你有旋轉動畫的removedOnCompletion屬性設置爲NO,例如,

rota.removedOnCompletion = NO; 

這應該離開表示層,其中當動畫完成它。默認值爲YES,可以恢復爲模型值,即您描述的行爲。

將在fillMode也應設置,即

rota.fillMode = kCAFillModeForwards; 
+0

我做到了。我添加了我用於問題的代碼。 – Mikle 2009-09-04 12:08:50

+9

fillMode的東西解決了它。天知道爲什麼需要:) – Mikle 2009-09-04 19:28:13

+0

@Allan任何想法爲什麼'fillMode'需要設置爲'kCAFillModeForwards'? – pixelfreak 2011-07-26 02:44:20

1

我發現,通過設置:removedOnCompletion = NO;

沒有產生儀器可見泄漏,但沒有得到解除了分配,並積累了小內存量。 IDK,如果它是我的實現或者什麼的,但是通過在動畫結尾處添加removeAllAnimations似乎清除了這一點殘留內存。

[myview.layer removeAllAnimations]; 
+0

它在模擬器或設備上嗎? – Pablo 2010-11-05 00:58:04

+0

是的好點,它是在模擬器上,我沒有嘗試在設備上,這顯然是真正的交易。這是一個非常小的增長。但是,我發現這是因爲我正在使用樂器尋找另一個泄漏,並且我看到了奇怪的記憶行爲。這樣做可以隔離我真正的漏洞,並且我能夠插入漏洞。這是xcode 3.2.4,在此之後,我確實獲得了回憶,始終回到起始數字 - 這感覺很好。 – yeahdixon 2010-11-11 16:02:12

+1

您正在爲表示層設置動畫。然後,您應該將模型圖層的'transform'屬性設置爲最終值,但是您應該使用'removedOnCompletion = NO'來保留表示層,從而以兩層而不是一層爲結尾。這就是你看到內存增加的原因。 – Jano 2012-12-13 23:01:41

4

我試圖旋轉箭頭來回,像Twitter的/ Facebook的「拉刷新」的效果。

的問題是,我在做旋轉來回在同一UIView的,因此增加

rotation.removedOnCompletion = NO; 
rotation.fillMode = kCAFillModeForwards; 

正向動畫戰爭工作正常,但向後動畫是不工作了。

所以我添加由yeahdixon建議的最後一行,並且除了設置視圖的變換,以動畫的完成狀態:(180度旋轉)

[myview.layer removeAllAnimations]; 
myView.transform = CGAffineTransformMakeRotation(M_PI); 

對於「恢復」動畫(向後)我做到這一點的完成:

myView.transform = CGAffineTransformMakeRotation(0); 

...並能正常工作。不知何故,它不需要removeAllAnimations調用。

+0

挖掘舊的答案,但爲'removeAllAnimations'事物+1。這使我的閃爍停止。 – Cyrille 2013-02-04 17:14:01