使用 UIView.Animate 动画图层不透明度

Animate Layer Opacity with UIView.Animate

我有 2 个 CALayers,每个都有一个图像。两者都有 0 的初始 Opacity

我想在 1 秒内将 Layer1 的 Opacity 设置为 1 的动画,立即开始。然后在延迟 0.5 秒后,我想在 1 秒内将 Layer2 的 Opacity 动画化为 1。这两层叠在一起。

我想要实现的是让第一张图片淡入,然后在它淡入时将第二张图片淡入。

但由于某些原因我无法使用 UIView.Animate,因为它根本没有动画,只是直接设置值。

        UIView.Animate(1, 0, UIViewAnimationOptions.CurveEaseIn, () => 
        {
            backgroundLayer.Opacity = 1;
        }, () => UIView.Animate(5, () => 
        {
            backgroundLayer2.Opacity = 1;
        }));

这里只是尝试 运行 一个接一个地直接播放动画,它仍然只是立即设置值,没有动画。

UIView 动画旨在为 UIView 属性设置动画,似乎不能很好地与 CALayers 一起播放。使用 UIImageViews 而不是 CALayers 可以解决您的问题(那么您应该使用 imageView.alpha 属性 而不是 layer.opacity 属性)。

但是,如果您坚持使用 CALayers,您可以使用 CABasicAnimation 为它们设置动画。下面的代码完成了您描述的动画(请注意,这是 Swift 代码,因为我不使用 Xamarin)。

    var animation1 = CABasicAnimation(keyPath: "opacity")
    // Don't go back to the initial state after the animation.
    animation1.fillMode = kCAFillModeForwards
    animation1.removedOnCompletion = false

    // Set the initial and final states of the animation.
    animation1.fromValue = 0
    animation1.toValue = 1

    // Duration of the animation.
    animation1.duration = 1.0


    var animation2 = CABasicAnimation(keyPath: "opacity")
    animation2.fillMode = kCAFillModeForwards
    animation2.removedOnCompletion = false

    animation2.fromValue = 0
    animation2.toValue = 1

    animation2.duration = 1.0

    // Add a 0.5 second delay.
    animation2.beginTime = CACurrentMediaTime() + 0.5

    // Animate!
    backgroundLayer.addAnimation(animation1, forKey: "opacity")
    backgroundLayer2.addAnimation(animation2, forKey: "opacity")

您只能使用 UIView.Animate 为以下属性设置动画:

  • UIView.Frame
  • UIView.Bounds
  • UIView.Center
  • UIView.Transform
  • UIView.Alpha
  • UIView.BackgroundColor
  • UIView.ContentStretch

对于更复杂的动画,您必须像@bjornorri 回答中那样使用 CABasicAnimation。

你们是对的,因为我试图使用不正确的方法为图层设置动画。我最终做的是用 UIImageView 替换图层并使用 UIView.Animate 更改 Alpha 属性。

这不仅更容易编码,似乎 UIImageView 在处理图像时实际上性能更高。