2012-09-16 142 views
16

我想创建一个CALayer动画,给出一种“浮华”效果。为此,我试图给“不透明”属性设置动画,但我的问题是我不知道从哪里开始以及如何去做。CALayer不透明度动画

这里是动画的图形说明:

opacity 
    | ___ 
1 | | | 
    | | | * repeatCount 
0 |___| |_ . . . 
    -------------------------> time 
    |______| 
    duration 

的不透明度开始于0,则动画为1,然后至0再次(这个0到1到0的动画需要数秒数等于持续时间)。然后这个过程重复'repeatCount'次。

下面是对代码的一些背景:

float duration = ...; // 0.2 secs, 1 sec, 3 secs, etc 
int repeactCount = ...; // 1, 2, 5, 6, ect 

CALayer* layer = ...; // I have a CALayer from another part of the code 
layer.opacity = 0; 

// Animation here 

done = YES; // IN THE END of the animation set this ivar to yes 

什么是实现这一目标的最佳方式是什么?我以前从未使用CALayers,因此这也是了解他们的动画系统如何工作的好机会。顺便说一下,我搜索了文档,并且我理解你如何添加一个或两个简单的动画,但我不知道如何做这个特定的动画。

+0

upvote for the graph XD –

回答

40

完成此操作的最佳方法是使用显式动画(请参阅guide),方法是创建一个CABasicAnimation的实例并将其添加到图层中。

的代码会是这个样子:

CABasicAnimation *flash = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
flash.fromValue = [NSNumber numberWithFloat:0.0]; 
flash.toValue = [NSNumber numberWithFloat:1.0]; 
flash.duration = 1.0;  // 1 second 
flash.autoreverses = YES; // Back 
flash.repeatCount = 3;  // Or whatever 

[layer addAnimation:flash forKey:@"flashAnimation"]; 

如果你想知道什么时候动画完成后,你可以设置一个委托并实施animationDidStop:finished:方法,但它最好使用完成块作为允许所有的代码在同一个地方。如果您正在为iOS 4或OS X编写代码,那么您可以使用出色的CAAnimationBlocks类别来完成此操作。

+0

谢谢!这是完美的。只是一件事:它是'animationWithKeyPath:' – Alex

+0

@Alex好吧,我会更新答案(它来自内存 - 不总是最可靠的来源...) – trojanfoe

+0

我不明白。它淡入,然后立即消失。 –

0

Trojanfoe的回答非常好。我只想补充一点,如果你想更好地控制“时间轴”(应该花多长时间才能淡出?我们应该等多久?那么应该花多长时间才能淡入?)等等。想要将多个CABasicAnimation组合成CAAnimationGroup。

你可能需要阅读关于这个主题我的书章,最后一部分的构成上CAAnimation及其后代的教程:

http://www.apeth.com/iOSBook/ch17.html#_core_animation

请注意,我的讨论是针对iOS的;在Mac OS X上,如果这就是你所在的位置,视图/图层体系结构有点不同,但它对CAAnimation的描述仍然是正确的。