Ios 在Swift中设置CAGradientLayer动画
我正在尝试使用Swift设置CAGradientLayer的动画。作为一种资源,我正在使用这个 这是我的密码Ios 在Swift中设置CAGradientLayer动画,ios,objective-c,swift,Ios,Objective C,Swift,我正在尝试使用Swift设置CAGradientLayer的动画。作为一种资源,我正在使用这个 这是我的密码 class ViewController: UIViewController { var gradient : CAGradientLayer?; override func viewDidLoad() { super.viewDidLoad() } override func viewDidAppear(animated: Bool) { sel
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中使用它。当我运行程序时,它会设置动画,但最后会返回到以前的颜色,因此我需要它保持蓝色。我检查了您的代码,在这里发现了一个错误。你忘了设置self.gradient的颜色,你只是给动画加了颜色,这就是为什么动画工作正常,最后你看到它的颜色变回了红色 编写缺少的代码:
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
。动画完成后,它会让您知道,然后您可以设置fromColors
和toColors
值,并反复调用animateLayer()
函数。但是对于这一点,您必须在代码中做一些更改
- 使
和从颜色
全局化到颜色
- 在委托方法中更改它们的值
- 再次调用
函数李>animateLayer()
委托
方法主体:
override func animationDidStop(anim: CAAnimation!, finished flag: Bool) {
self.toColors = self.fromColors;
self.fromColors = self.gradient?.colors
animateLayer()
}
您也可以在此处检查工作代码:以供将来参考。。。100%的CPU使用率是由animationDidStop函数引起的。它在当前动画尚未完成时重新启动动画。请检查完成标志:
override func animationDidStop(anim: CAAnimation, finished: Bool) {
if finished {
self.toColors = self.fromColors;
self.fromColors = self.gradient?.colors
animateLayer()
}
}
我在Objective-C中尝试过这个方法,它是有效的,但我需要使用它
在Swift中,当我运行程序时,它会设置动画,但会返回到
在结束前的颜色,我需要它所以保持蓝色
你只需要:
animation.removedOnCompletion = false // not true like in your code
对于那些在评论中询问无休止动画的人,以下是我的无休止动画背景的股票示例代码:- 充分的讨论和结果
如何连续重复此渐变过渡?知道当您切换到另一个视图并返回到该视图时,动画为何开始闪烁/结巴并变得疯狂吗?@TheFlarnet请确保您在返回时没有启动新动画。避免制作此动画的新实例,或停止最后一个动画,然后开始新的动画。@TheTiger在开发连续重复动画的方法方面做了出色的工作;但是,在本例中,我无法停止最后一个动画以启动新动画。返回序列会干扰代理和
animateLayer()
,以及其中的removedOnCompletion
。请注意,动画对象有一个repeatCount
和一个autoreverses
属性,该属性可以很好地处理重复,而不需要代理或计时器。不建议使用,如果您再次更改颜色,它将不会从当前颜色开始。这不起作用。它只创建渐变,但不创建动画。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// create the gradient layer
let gradient = CAGradientLayer()
gradient.frame = self.view.bounds
gradient.startPoint = CGPoint(x:0.0, y:0.5)
gradient.endPoint = CGPoint(x:1.0, y:0.5)
gradient.colors = [UIColor.red.cgColor, UIColor.green.cgColor]
gradient.locations = [-0.5, 1.5]
let animation = CABasicAnimation(keyPath: "colors")
animation.fromValue = [UIColor.red.cgColor, UIColor.green.cgColor]
animation.toValue = [UIColor.green.cgColor, UIColor.red.cgColor]
animation.duration = 5.0
animation.autoreverses = true
animation.repeatCount = Float.infinity
// add the animation to the gradient
gradient.add(animation, forKey: nil)
// add the gradient to the view
self.view.layer.addSublayer(gradient)
}
}