2016-07-25 4 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 
}() 

Ради полноты, что вы первоначально был вычисленное свойство, которое означает, что код выполняется каждый раз, когда вы к нему доступ. С ленивыми свойствами код выполняется только один раз, когда свойство сначала получает доступ, а затем возвращается тот же объект.

Различие можно наблюдать с этой игровой площадкой:

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