CAGradientLayer 颜色变化动画不执行
CAGradientLayer color change animation not executing
我正在尝试制作一个非常基本的 CAGradientLayer
动画。我有一个基本的 2 色 CAGradientLayer
设置并添加到我的 UIViewController
.
// 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
中产生任何变化。我在这里做错了什么?
您每次从 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
我正在尝试制作一个非常基本的 CAGradientLayer
动画。我有一个基本的 2 色 CAGradientLayer
设置并添加到我的 UIViewController
.
// 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
中产生任何变化。我在这里做错了什么?
您每次从 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