【问题标题】:How to animate a CALayer to have empty contents如何为 CALayer 设置动画以使其内容为空
【发布时间】:2013-10-06 22:11:10
【问题描述】:

我有一个带有图像的CALayer,它有几个子层。我想动画它没有内容(没有图像),但继续显示子层。此代码不起作用:

   CABasicAnimation *backgroundOut = [CABasicAnimation animationWithKeyPath:@"contents"];
   backgroundOut.toValue = [NSNull null];
   backgroundOut.fillMode = kCAFillModeForwards;
   backgroundOut.removedOnCompletion = NO;
   backgroundOut.duration = 3.0;
   [_backgroundLayer addAnimation:backgroundOut forKey:@"contents"];

这是我可以让它工作的唯一方法:

   backgroundOut.toValue = (__bridge id)([UIImage imageNamed:@"blankImage"].CGImage); 

请注意,我不想弄乱不透明度或其他任何东西,因为该图层具有仍然需要可见的子图层。

为空内容设置动画的正确方法是什么?

【问题讨论】:

  • 你试过 backgroundOut.toValue = (id)nil 吗?
  • 是的,我尝试将 toValue 设置为 nil。它不起作用,因为这实际上意味着我们的当前值。

标签: uiimage core-animation calayer cabasicanimation


【解决方案1】:

另一种方法可能是创建一个单独的层来包含您的图像,该层与您的其他层是对等的,但就在其他层之后(您可以使用 zposition 将其显式放置在其他层的后面)——所有这些都包含在一个根层。然后,您可以为图像层的 alpha 设置动画以进行淡入淡出,这样就不会产生动态创建图像的开销,也不会淡出其他层。

【讨论】:

  • 是的,这也可以。我希望能够在没有额外层的情况下逃脱,但这听起来是个好方法。
【解决方案2】:

我认为这是最干净的方法,因为没有其他答案:

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 1), NO, 0);
    UIImage *blank = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    CABasicAnimation *backgroundOut = [CABasicAnimation animationWithKeyPath:@"contents"];
    backgroundOut.toValue = (__bridge id)(blank.CGImage);
    backgroundOut.fillMode = kCAFillModeForwards;
    backgroundOut.removedOnCompletion = NO;
    backgroundOut.duration = 3.0;

    [_backgroundLayer addAnimation:backgroundOut forKey:@"contents"];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多