2013-05-01 55 views
0

考慮以下動畫的最終值:如何使一個層保持CABasicAnimation

CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; 
pathAnimation.duration = 1.0; 
pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
pathAnimation.fromValue = [NSNumber numberWithFloat:0.0f]; 
pathAnimation.toValue = [NSNumber numberWithFloat:1.0f]; 
pathAnimation.removedOnCompletion = NO; 
pathAnimation.delegate = self; 

這將主要從一端到下一個動畫層的圖紙。問題是,一旦動畫完成,strokeEnd屬性重置爲0(最初設置的位置)。我如何使最終價值「堅持」?

我試圖在animationDidStop委託方法中改變這一點。這大部分工作,但可以簡要地在0處引起strokeEnd的閃爍,即使放入CATransaction中以禁用動畫。我也玩過additivecumulative屬性無濟於事。有什麼建議麼?

+0

可能的重複[圓形筆畫的筆畫動畫以完整筆畫結束](http://stackoverflow.com/questions/9142888/animation-of-stroke-of-circle-segment-ends-in-complete-stroke ) – Jano 2013-05-01 21:42:25

+0

我發現在我的實際圖層上設置屬性更容易,然後應用指定時間和緩動的動畫。在某些情況下,我會特別指定起始值,但將結束值設置爲動畫會自動解決此問題。 – Marc 2013-05-02 16:08:00

回答

7

您只需將strokeEnd屬性自己設置爲其最終值!就像這樣:

// your current code (stripped of unnecessary stuff) 

CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; 
pathAnimation.duration = 1.0; 
pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
pathAnimation.fromValue = [NSNumber numberWithFloat:0.0f]; 
pathAnimation.toValue = [NSNumber numberWithFloat:1.0f]; 

// just add this to it: 

theLayer.strokeEnd = 1; 

// and now add the animation to theLayer 

如果strokeEnd是隱式動畫(使該行本身會導致動畫),我們會關掉隱動畫第一:

[CATransaction setDisableActions:YES]; 
theLayer.strokeEnd = 1; 

請注意,您pathAnimation.removedOnCompletion = NO;是錯誤的,所以是另一個答案是kCAFillModeForwards。兩者都是基於對Core Animation如何工作的誤解。

+0

感謝您的澄清,正如我在回答中的評論中所寫的那樣,我一直認爲設置fillMode會導致模型層在動畫結束時更新。只是要知道,當一個應該使用fillMode和removedOnCompletion = NO?我在想那個,但我找不到一個例子。 – 2013-05-01 22:05:09

+0

它們在複雜的分組動畫中很有用。再次看到我上面提到的書(在'fillMode'上搜索該章節)。關鍵是,這個伎倆是一個很大的誤解,不幸的是在互聯網上鬆動了。甚至蘋果公司也有一個例子,他們對此產生了錯誤的印象(節拍器,現在已經被取消)。 – matt 2013-05-01 22:08:39

+0

完美,再次感謝你。 – 2013-05-01 22:13:53