动画隐藏CALayer

6

我正在尝试在几微秒后隐藏一个 CALayer,并且我使用 CABasicAnimation 来动画隐藏。

目前我正在尝试使用

[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"];

但是当我运行这个代码时,图层立即隐藏了,而不是等待所需的开始时间。

我对我的keyPath是否为“hidden”并没有把握,但是找不到其他选项,文档确实说明了CALayerhidden属性是可动画的。

有什么正确的方法可以实现我想要的效果吗?

5个回答

3

从CAMediaTiming.h文件中可以看到,beginTime属性是这样描述的:

对象的开始时间与其父对象(如果适用)的关系。默认为0。

你应该使用CACurrentMediaTime() +所需的时间偏移量。

[hideAnimation setBeginTime:CACurrentMediaTime() + 0.09];

1
非常有用的技巧,但当动画结束时,不透明度值会回到初始值。我该怎么解决这个问题?谢谢!Bogdan。 - Bogdan

3
尝试使用opacity属性进行动画处理。将值从1.0变为0.0,您应该能够获得所需的效果。

2
如果你想要立即更改而不是淡出,可以使用calculationMode中的kCAAnimationDiscrete值来创建CAKeyframeAnimation。您还应将fillMode属性设置为kCAFillModeBoth - Lily Ballard
谢谢,我一定会研究一下,但是现在我做的事情为什么不起作用呢?只是为了满足我的好奇心 :) - Tom Irving
使用不透明度并没有改变任何东西。图层立即隐藏/透明,完全忽略动画。我的animationDidStop委托方法也会立即调用,即使我的持续时间为100秒(仅用于测试目的)。 - Tom Irving

2

swift 4

    let keyframeAnimation = CAKeyframeAnimation(keyPath: "hidden")
keyframeAnimation.calculationMode = kCAAnimationDiscrete
keyframeAnimation.repeatCount = 1.0
keyframeAnimation.values = [true, false,true,false,true]
keyframeAnimation.keyTimes = [0.0, 0.25,0.5,0.75, 1.0]
keyframeAnimation.duration = 30.0 //duration of the video in my case
keyframeAnimation.beginTime = 0.1
keyframeAnimation.isRemovedOnCompletion = false
keyframeAnimation.fillMode = kCAFillModeBoth

textLayer.add(keyframeAnimation, forKey:  "hidden")

2
我确定这对原帖发布者来说已经太晚了,但它可能会帮助其他人。我一直在尝试做类似的事情,只是在更改hidden属性时使动画隐含。正如Tom所说,使用opacity进行动画处理在这种情况下不起作用,因为即使我使用beginTime延迟动画,图层的隐藏属性的更改似乎也立即生效。
标准的隐式操作使用淡入淡出过渡(CATransitiontype = kCATransitionFade),但这适用于整个图层,而我想同时执行另一个动画,这不是兼容的操作。
经过多次尝试,我最终注意到了@Kevin上面的评论,并且——嗨!——那真的可以工作!所以我想强调一下,以便将来搜索的人能更容易地找到解决方案:
CAKeyframeAnimation* hiddenAnim = [CAKeyframeAnimation animationWithKeyPath:@"hidden"];
hiddenAnim.values = @[@(NO),@(YES)];
hiddenAnim.keyTimes = @[@0.0, @1.0];
hiddenAnim.calculationMode = kCAAnimationDiscrete;
hiddenAnim.duration = duration;

这将延迟隐藏直到持续时间结束。将其与其他属性动画组合在一起,在图层消失之前看到它们的效果。(您可以将其与不透明度动画结合,使图层淡出,同时执行另一个动画效果。)

谢谢,Kevin!


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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接