2010-07-15 161 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];