2012-04-23 22 views
4

這很有趣......我認爲,通過這樣可以在將CAAnimation實例添加到圖層後進行修改來重用CAAnimation實例嗎?

CABasicAnimation* a = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
    a.fromValue = [NSNumber numberWithFloat:0.]; 
    a.toValue = [NSNumber numberWithFloat:1.]; 
    a.duration = .4; 
    a.fillMode = kCAFillModeBoth; 
    a.removedOnCompletion = NO; 

CGFloat timeOffset = 0; 
for(CALayer* layer in layers) 
{ 
    a.beginTime = [someCommonSuperView.layer convertTime:CACurrentMediaTime()fromLayer:nil] + timeOffset; 
    [layer addAnimation:a forKey:nil]; 
    timeOffset += .4; 
} 

我其實一直修改同一CABasicAnimation的BEGINTIME,只是增加它的引用計數。所以我不會讓一系列的圖層逐漸消失,而是應該搞亂所有圖層的開始時間,可能會導致所有圖層在最後一個圖層時立即出現。但上面的代碼實際上似乎工作在層順序淡入。

那麼以這種方式重用動畫是否合理?爲了不在每次傳遞中創建它的新實例?

AddAnimation實際上是製作動畫的深層副本,而不是增加引用計數?

回答

8

根據the docs

- (void)addAnimation:(CAAnimation *)anim forKey:(NSString *)key

添加動畫對象到接收器的渲染樹爲指定的鍵。

參數anim

動畫添加到渲染樹。請注意,該對象是由渲染樹複製的 ,未引用。對對象的任何後續 修改都不會傳播到渲染 樹中。

所以我會說可以安全地重複使用相同的CAAnimation對象。

+0

噢,真好!我感到非常愚蠢,我只是錯過了它在這裏一直在參考。很抱歉讓你「爲我查找」。有趣的是,我已經遇到了上面示例中的幾個案例,它們似乎通過修改單個動畫來影響其他圖層。但現在很明顯,我可能搞亂了其他一些東西(可能是一個團體的財產)。謝謝! – SaldaVonSchwartz 2012-04-24 23:50:44