2016-07-25 6 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

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 
:

의 차이는이 놀이터로 관찰 할 수있다