【问题标题】:Animate CALayer hide动画 CALayer 隐藏
【发布时间】:2011-03-16 16:42:13
【问题描述】:

我试图在几微秒后隐藏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 是否为“隐藏”,但找不到任何其他选项,并且文档确实指出 CALayerhidden 属性是可动画的。

实现我正在寻找的正确方法是什么?

【问题讨论】:

    标签: objective-c cocoa calayer cabasicanimation


    【解决方案1】:

    尝试为 opacity 属性设置动画。从 1.0 到 0.0,你应该得到你想要的效果。

    【讨论】:

    • 如果您希望它立即更改而不是淡出,您可以使用 kCAAnimationDiscretecalculationMode 值进行 CAKeyframeAnimation。您还应该将fillMode 属性设置为kCAFillModeBoth
    • 谢谢,我一定会调查的,但是我现在正在做的事情不起作用是有原因的吗?只是为了满足我的好奇心:)
    • 不幸的是,使用不透明度并没有改变任何东西。该层立即隐藏/透明,完全忽略动画。即使我的持续时间大约为 100 秒(仅用于测试目的),我的 animationDidStop 委托方法也会立即调用。
    【解决方案2】:

    来自 CAMediaTiming.h,它说的是 beginTime 属性:

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

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

    [hideAnimation setBeginTime:CACurrentMediaTime() + 0.09];
    

    【讨论】:

    • 非常有用的提示,但是当动画结束时,不透明度值又回到了最初的那个。我怎样才能解决这个问题?谢谢!波格丹。
    【解决方案3】:

    我确信这对原始海报有任何好处为时已晚,但它可能对其他人有所帮助。我一直在尝试做类似的事情,除了在 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;
    

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

    谢谢你,凯文!

    【讨论】:

      【解决方案4】:

      斯威夫特 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")
      

      【讨论】:

        【解决方案5】:
            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];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-07
          • 1970-01-01
          • 2016-08-10
          • 1970-01-01
          • 2016-05-16
          • 2011-08-15
          • 2011-01-15
          • 1970-01-01
          相关资源
          最近更新 更多