2016-07-25 2 views
2

私は非常に基本的なCAGradientLayerアニメーションを動作させようとしています。私は基本的な2色CAGradientLayerを設定し、私のUIViewControllerに追加しました。CAGradientLayer色変更アニメーションが実行されない

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

新しいlayerオブジェクトは、毎回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 
}() 

完全性期すために、あなたはもともとコードは、あなたがそれにアクセスするたびに実行されたことを意味し、計算プロパティは、だったのか。遅延プロパティでは、プロパティは最初にアクセスされ、同じオブジェクトが返されるたびにコードが1回だけ実行されます。

違いは、この遊び場で観察することができる。

//: 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 
関連する問題