2016-07-25 29 views
2

Ich versuche, eine sehr einfache CAGradientLayer Animation zu arbeiten. Ich habe eine grundlegende 2 Farbe CAGradientLayer eingerichtet und hinzugefügt, um meine UIViewController.CAGradientLayer Farbwechsel Animation nicht ausgeführt

// 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 
} 

Ich versuche es mit dem folgenden Code zu animieren:

@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") 
} 

jedoch dieser Code nicht nachgibt im CAGradientLayer jede Änderung. Was mache ich hier falsch?

Antwort

4

Sie geben jedes Mal ein neues layer Objekt von Ihrer gradientLayer Eigenschaft zurück. Sie müssen sie ein wenig ändern, so dass sie träge initiiert wird:

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 
}() 

Der Vollständigkeit halber, was Sie ursprünglich hatte eine berechnete Eigenschaft war, was dazu führte, dass der Code jedes Mal, wenn auf sie zugegriffen durchgeführt wurde. Bei faulen Eigenschaften wird der Code nur einmal ausgeführt, wenn auf die Eigenschaft zum ersten Mal zugegriffen wird und dann dasselbe Objekt zurückgegeben wird.

//: 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 
:

Der Unterschied kann mit diesem Spielplatz beobachtet werden