在Swift中animationCagradientLayer
我正在尝试使用Swift为CAGradientLayer创buildanimation。 对于我正在使用这个职位的资源
这是我的代码
class ViewController: UIViewController { var gradient : CAGradientLayer?; override func viewDidLoad() { super.viewDidLoad() } override func viewDidAppear(animated: Bool) { self.gradient = CAGradientLayer() self.gradient?.frame = self.view.bounds self.gradient?.colors = [ UIColor.redColor().CGColor, UIColor.redColor().CGColor] self.view.layer.insertSublayer(self.gradient, atIndex: 0) animateLayer() } func animateLayer(){ var fromColors = self.gradient?.colors var toColors: [AnyObject] = [ UIColor.blueColor().CGColor, UIColor.blueColor().CGColor] var animation : CABasicAnimation = CABasicAnimation(keyPath: "colors") animation.fromValue = fromColors animation.toValue = toColors animation.duration = 3.00 animation.removedOnCompletion = true animation.fillMode = kCAFillModeForwards animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) animation.delegate = self self.gradient?.addAnimation(animation, forKey:"animateGradient") } }
我已经在Objective-C中尝试了这一点,它的工作原理,但我需要在Swift中使用它,当我运行程序animation,但在结束时回到以前的颜色,我需要它保持蓝色。
我检查了你的代码,发现这里有一个错误。 你忘了设置self.gradient
颜色,你只是给颜色animation这就是为什么animation工作正常,最后你看到它的颜色回到red
。
写下这个缺失的代码:
var toColors: [AnyObject] = [UIColor.blueColor().CGColor, UIColor.blueColor().CGColor] self.gradient.colors = toColors // You missed this line var animation : CABasicAnimation = CABasicAnimation(keyPath: "colors")
您也可以在这里检查工作代码: 示例
更新: 我如何连续重复这个渐变过渡?
所以你可以使用CAAnimation
delegate
。 它会让你知道一旦animation已经完成,然后你可以设置fromColors
和toColors
值,并一次又一次地调用animateLayer()
函数。 但是为此,您将不得不在代码中进行一些更改。
- 使
fromColors
和toColors
全球。 - 在
animationDidStop
委托方法中更改它们的值。 - 再次调用
animateLayer()
函数。
这里是delegate
方法体:
override func animationDidStop(anim: CAAnimation!, finished flag: Bool) { self.toColors = self.fromColors; self.fromColors = self.gradient?.colors animateLayer() }
你也可以在这里检查工作代码: 示例
我已经在Objective-C中尝试了这一点,它的工作原理,但我需要在Swift中使用它,当我运行程序animation,但在结束时回到以前的颜色,我需要它保持蓝色。
你只需要:
animation.removedOnCompletion = false // not true like in your code
供将来参考… 100%的CPU使用率是由animationDidStop函数引起的。 在当前animation未完成的情况下重新开始animation。 请检查完成的标志:
override func animationDidStop(anim: CAAnimation, finished: Bool) { if finished { self.toColors = self.fromColors; self.fromColors = self.gradient?.colors animateLayer() } }