Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CAGradientLayer颜色更改动画未执行_Ios_Swift_Core Graphics_Caanimation_Cagradientlayer - Fatal编程技术网

Ios CAGradientLayer颜色更改动画未执行

Ios CAGradientLayer颜色更改动画未执行,ios,swift,core-graphics,caanimation,cagradientlayer,Ios,Swift,Core Graphics,Caanimation,Cagradientlayer,我正在尝试制作一个非常基本的CAGradientLayer动画。我有一个基本的2色CAGradientLayer设置,并添加到我的UIViewController // Set up the gradient layer. var gradientLayer: CAGradientLayer! { let layer = CAGradientLayer() layer.frame = self.view.bounds layer.colors = [UIColor.red

我正在尝试制作一个非常基本的
CAGradientLayer
动画。我有一个基本的2色
CAGradientLayer
设置,并添加到我的
UIViewController

// Set up the gradient layer.
var gradientLayer: CAGradientLayer! {
    let layer = CAGradientLayer()
    layer.frame = self.view.bounds
    layer.colors = [UIColor.redColor().CGColor, UIColor.yellowColor().CGColor]
    layer.locations = [0.0, 1.0]
    return layer
}
我正在尝试使用以下代码设置动画:

@IBAction func changeBackground(sender: AnyObject) {
    let oldColors = self.gradientLayer.colors
    let newColors = [UIColor.purpleColor().CGColor, UIColor.blueColor().CGColor]
    self.gradientLayer.colors = newColors
    let animation: CABasicAnimation = CABasicAnimation(keyPath: "colors")

    animation.fromValue = oldColors
    animation.toValue = newColors
    animation.duration = 0.3
    animation.removedOnCompletion = true
    animation.fillMode = kCAFillModeForwards
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
    animation.delegate = self

    self.gradientLayer.addAnimation(animation, forKey: "animateGradientColorChange")
}

但是,此代码不会对
CAGradientLayer
产生任何更改。我做错了什么?

您每次都从
gradientLayer
属性返回一个新的
对象。您需要对其进行一点更改,以使其惰性地启动:

lazy var gradientLayer: CAGradientLayer! = {
    let layer = CAGradientLayer()
    layer.frame = self.view.bounds
    layer.colors = [UIColor.redColor().CGColor, UIColor.yellowColor().CGColor]
    layer.locations = [0.0, 1.0]
    return layer
}()
为了完整性起见,您最初拥有的是一个计算属性,这意味着每次访问它时都会执行代码。对于惰性属性,当第一次访问属性时,代码只执行一次,然后返回相同的对象

在这个操场上可以观察到不同之处:

//: Playground - noun: a place where people can play

import UIKit

struct Dummy {

    var gradientLayer: CAGradientLayer! {
        let layer = CAGradientLayer()
        layer.colors = [UIColor.redColor().CGColor, UIColor.yellowColor().CGColor]
        layer.locations = [0.0, 1.0]
        return layer
    }

    lazy var lazyGradientLayer: CAGradientLayer! = {
        let layer = CAGradientLayer()
        layer.colors = [UIColor.redColor().CGColor, UIColor.yellowColor().CGColor]
        layer.locations = [0.0, 1.0]
        return layer
    }()
}

var dummy = Dummy()

let l1 = dummy.gradientLayer
let l2 = dummy.gradientLayer

let lazy1 = dummy.lazyGradientLayer
let lazy2 = dummy.lazyGradientLayer