2010-07-15 213 views
3

我試圖在幾微秒後隱藏CALayer,並且我使用CABasicAnimation來爲隱藏設置動畫。動畫CALayer隱藏

目前,我試圖用

[aLayer setHidden:YES]; 

CABasicAnimation * hideAnimation = [CABasicAnimation animationWithKeyPath:@"hidden"]; 
[hideAnimation setDuration:aDuration]; 
[hideAnimation setFromValue:[NSNumber numberWithBool:NO]]; 
[hideAnimation setToValue:[NSNumber numberWithBool:YES]]; 
[hideAnimation setBeginTime:0.09]; 
[hideAnimation setRemovedOnCompletion:NO]; 
[hideAnimation setDelegate:self]; 

[alayer addAnimation:hideAnimation forKey:@"hide"]; 

但是當我運行此,該層立即隱藏,而不是等待所需BEGINTIME。

我不確定我的keyPath爲「隱藏」,但找不到任何其他選項,並且文檔確實聲明CALayerhidden屬性是可動畫的。

什麼是正確的方法來實現我在找什麼?

回答

3

嘗試使用不透明屬性的動畫效果。從1.0到0.0,你應該得到你想要的效果。

+2

如果您希望它立即更改而不是淡出,您可以使用'calculationMode'的'kCAAnimationDiscrete'值進行CAKeyframeAnimation。 您還應該將'fillMode'屬性設置爲'kCAFillModeBoth'。 – 2010-07-15 23:02:10

+0

謝謝,我一定會研究它,但是有什麼理由說明我目前在做什麼不工作?只是爲了滿足我的好奇:) – 2010-07-15 23:06:30

+0

不幸的是,使用opacity並沒有改變任何東西。該圖層立即隱藏/變爲透明,完全忽略動畫。即使我的持續時間大約是100秒(僅用於測試目的),我也會立即調用animationDidStop的委託方法。 – 2010-07-16 16:13:44

3

從CAMediaTiming.h,它說,大約BEGINTIME屬性:

的開始對象的時候,在 相對於它的父對象,如果 適用。默認爲0.

您應該使用CACurrentMediaTime()+所需的時間偏移量。

[hideAnimation setBeginTime:CACurrentMediaTime() + 0.09]; 
+1

真正有用的技巧,但動畫結束時,不透明度值會返回到最初的值。我怎樣才能解決這個問題? 謝謝!波格丹。 – Bogdan 2012-07-17 12:33:04

3

我敢肯定,現在做這個原始海報已經太晚了,但它可能會幫助其他人。我一直在嘗試做類似的事情,除了在hidden屬性更改時隱含動畫。正如湯姆所說,動畫opacity在這種情況下不起作用,因爲圖層隱藏屬性的更改似乎立即生效(即使我將動畫延遲爲beginTime)。

標準隱式動作使用淡入淡出轉換(CATransition,type = kCATransitionFade),但是這會在整個圖層上運行,並且我想同時執行另一個動畫,這不是兼容操作。

經過大量實驗後,我終於注意到了@凱文的評論,並且---你好! ---這實際上有效!所以,我只是想叫出來,所以解決的辦法是更可見的未來搜索:

CAKeyframeAnimation* hiddenAnim = [CAKeyframeAnimation animationWithKeyPath:@"hidden"]; 
hiddenAnim.values = @[@(NO),@(YES)]; 
hiddenAnim.keyTimes = @[@0.0, @1.0]; 
hiddenAnim.calculationMode = kCAAnimationDiscrete; 
hiddenAnim.duration = duration; 

這會延遲隱藏,直到時間的盡頭。將其與其他屬性動畫組合在一起,以在層消失之前看到它們的效果。 (您可以將它與不透明度動畫結合使用,使圖層淡出,同時執行另一個動畫。)

謝謝凱文!

0
CABasicAnimation *endAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
    endAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    [endAnimation setFromValue:[NSNumber numberWithFloat:1]]; 
    [endAnimation setToValue:[NSNumber numberWithFloat:0.0]]; 
    [endAnimation setBeginTime:AVCoreAnimationBeginTimeAtZero]; 
    endAnimation.duration   = 5; 
    endAnimation.removedOnCompletion = NO; 
    [alayer addAnimation:endAnimation forKey:nil];