Ios 在Swift中设置CAGradientLayer动画

Ios 在Swift中设置CAGradientLayer动画,ios,objective-c,swift,Ios,Objective C,Swift,我正在尝试使用Swift设置CAGradientLayer的动画。作为一种资源,我正在使用这个 这是我的密码 class ViewController: UIViewController { var gradient : CAGradientLayer?; override func viewDidLoad() { super.viewDidLoad() } override func viewDidAppear(animated: Bool) { sel

我正在尝试使用Swift设置CAGradientLayer的动画。作为一种资源,我正在使用这个

这是我的密码

class ViewController: UIViewController {

  var gradient : CAGradientLayer?;

  override func viewDidLoad() {
    super.viewDidLoad()
  }

  override func viewDidAppear(animated: Bool) {

    self.gradient = CAGradientLayer()
    self.gradient?.frame = self.view.bounds
    self.gradient?.colors = [ UIColor.redColor().CGColor, UIColor.redColor().CGColor]
    self.view.layer.insertSublayer(self.gradient, atIndex: 0)

    animateLayer()
  }

  func animateLayer(){

    var fromColors = self.gradient?.colors
    var toColors: [AnyObject] = [ UIColor.blueColor().CGColor, UIColor.blueColor().CGColor]

    var animation : CABasicAnimation = CABasicAnimation(keyPath: "colors")

    animation.fromValue = fromColors
    animation.toValue = toColors
    animation.duration = 3.00
    animation.removedOnCompletion = true
    animation.fillMode = kCAFillModeForwards
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
    animation.delegate = self

    self.gradient?.addAnimation(animation, forKey:"animateGradient")
  }
}

我曾在Objective-C中尝试过这一点,它可以工作,但我需要在Swift中使用它。当我运行程序时,它会设置动画,但最后会返回到以前的颜色,因此我需要它保持蓝色。

我检查了您的代码,在这里发现了一个错误。你忘了设置self.gradient的颜色,你只是给动画加了颜色,这就是为什么动画工作正常,最后你看到它的颜色变回了红色

编写缺少的代码:

var toColors: [AnyObject] = [UIColor.blueColor().CGColor, UIColor.blueColor().CGColor]
self.gradient.colors = toColors // You missed this line
var animation : CABasicAnimation = CABasicAnimation(keyPath: "colors")
您也可以在此处检查工作代码:


更新:如何连续重复此渐变过渡?

因此,您可以使用
CAAnimation
delegate
。动画完成后,它会让您知道,然后您可以设置
fromColors
toColors
值,并反复调用
animateLayer()
函数。但是对于这一点,您必须在代码中做一些更改

  • 使
    从颜色
    到颜色
    全局化
  • 在委托方法中更改它们的值
  • 再次调用
    animateLayer()
    函数
以下是
委托
方法主体:

override func animationDidStop(anim: CAAnimation!, finished flag: Bool) {

    self.toColors = self.fromColors;
    self.fromColors = self.gradient?.colors
    animateLayer()
}

您也可以在此处检查工作代码:

以供将来参考。。。100%的CPU使用率是由animationDidStop函数引起的。它在当前动画尚未完成时重新启动动画。请检查完成标志:

override func animationDidStop(anim: CAAnimation, finished: Bool) {
    if finished {
        self.toColors = self.fromColors;
        self.fromColors = self.gradient?.colors

        animateLayer()
    }
}
我在Objective-C中尝试过这个方法,它是有效的,但我需要使用它 在Swift中,当我运行程序时,它会设置动画,但会返回到 在结束前的颜色,我需要它所以保持蓝色

你只需要:

animation.removedOnCompletion = false // not true like in your code

对于那些在评论中询问无休止动画的人,以下是我的无休止动画背景的股票示例代码:-

充分的讨论和结果


如何连续重复此渐变过渡?知道当您切换到另一个视图并返回到该视图时,动画为何开始闪烁/结巴并变得疯狂吗?@TheFlarnet请确保您在返回时没有启动新动画。避免制作此动画的新实例,或停止最后一个动画,然后开始新的动画。@TheTiger在开发连续重复动画的方法方面做了出色的工作;但是,在本例中,我无法停止最后一个动画以启动新动画。返回序列会干扰代理和
animateLayer()
,以及其中的
removedOnCompletion
。请注意,动画对象有一个
repeatCount
和一个
autoreverses
属性,该属性可以很好地处理重复,而不需要代理或计时器。不建议使用,如果您再次更改颜色,它将不会从当前颜色开始。这不起作用。它只创建渐变,但不创建动画。
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // create the gradient layer
        let gradient = CAGradientLayer()
        gradient.frame = self.view.bounds
        gradient.startPoint = CGPoint(x:0.0, y:0.5)
        gradient.endPoint = CGPoint(x:1.0, y:0.5)
        gradient.colors = [UIColor.red.cgColor, UIColor.green.cgColor]
        gradient.locations =  [-0.5, 1.5]

        let animation = CABasicAnimation(keyPath: "colors")
        animation.fromValue = [UIColor.red.cgColor, UIColor.green.cgColor]
        animation.toValue = [UIColor.green.cgColor, UIColor.red.cgColor]
        animation.duration = 5.0
        animation.autoreverses = true
        animation.repeatCount = Float.infinity

        // add the animation to the gradient
        gradient.add(animation, forKey: nil)

        // add the gradient to the view
        self.view.layer.addSublayer(gradient)
    }
 }