2016-07-25 104 views
2

我试图获得一个非常基本的CAGradientLayer动画。我有一个基本的2色CAGradientLayer设置并添加到我的UIViewControllerCAGradientLayer颜色更改动画未执行

// 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任何变化。我在这里做错了什么?

回答

4

您每次从gradientLayer属性返回一个新的layer对象。你需要改变它一下,所以它懒洋洋地启动:

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 

的差异可以与此游乐场中观察到