2016-12-29 68 views
-1

我目前有一个渐变颜色背景(见下文),但我想逐渐将颜色更改为阴影,我将在数组中预先定义并使其循环。我怎样才能做到这一点?如何不断改变渐变色背景?

var colorTop = UIColor(red: 255.0/255.0, green: 149.0/255.0, blue: 0.0/255.0, alpha: 1.0).cgColor 
var colorBottom = UIColor(red: 255.0/255.0, green: 94.0/255.0, blue: 58.0/255.0, alpha: 1.0).cgColor 

func configureGradientBackground(colors:CGColor...){ 
    let gradient: CAGradientLayer = CAGradientLayer() 
    let maxWidth = max(self.view.bounds.size.height,self.view.bounds.size.width) 
    gradient.startPoint = CGPoint(x: 0, y: 0) 
    gradient.endPoint = CGPoint(x: 1, y: 1) 

    let squareFrame = CGRect(origin: self.view.bounds.origin, size: CGSize(width: maxWidth, height: maxWidth * 0.935)) 
    gradient.frame = squareFrame 

    gradient.colors = colors 
    view.layer.insertSublayer(gradient, at: 0) 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    configureGradientBackground(colors: colorTop, colorBottom) 
} 

回答

0

你可以在你的viewDidLoad一个变量,它是跟踪数组包含所有你的颜色索引的一个int。例如,0是你的第一个颜色,1是你的第二个颜色,依此类推。然后在你的无限while循环(也在viewDidLoad),你可以这样写:

if tracker == 0 { 
    // apply first color 
} else if tracker == 1{ 
    // apply second color 
} ... 

然后你可以在最后一个递增跟踪器,然后检查你的,如果你的追踪是你过去的数组的大小(例如,你只有11种颜色)。

tracker += 1 
if tracker > 10 { 
    tracker = 0 
} 
+0

但是,这不会给我带来持续更新颜色的问题吗?我尝试通过再次调用configureGradientBackground来实现新颜色来更改渐变颜色,但它不更新颜色; +我想以某种方式将过渡动画化,以便它可以清晰地改变颜色;有任何想法吗? –

+0

[这](http://stackoverflow.com/questions/30380910/changing-uiview-background-color-using-an-animation)可能会帮助你的动画部分,其余的只是循环无限'while'改变你的颜色,因为上面的答案暗示 – Tj3n

+0

但是这不更新颜色;因为当我调用某些东西来改变渐变的值时,它不会更新屏幕上的颜色 –

1

真的很简单;我无法想象你有什么困难。 CAGradientLayer的colors属性本身是动画的,因此您只需动画colors的更改,并在动画结束时继续执行colors更改的下一个动画。

在这个例子中,我只交替两组颜色,你的和蓝绿。所以我的state是一个简单的布尔。但显然这个例子可以扩展到任意数量的状态,也就是任意数量的颜色对。

let colorTop = UIColor(red: 255.0/255.0, green: 149.0/255.0, blue: 0.0/255.0, alpha: 1.0).cgColor 
let colorBottom = UIColor(red: 255.0/255.0, green: 94.0/255.0, blue: 58.0/255.0, alpha: 1.0).cgColor 
var state = false 
var grad : CAGradientLayer? 
override func viewDidLoad() { 
    // configure the gradient layer, start the animation   
} 
func animate() { 
    let arr = self.state ? [colorTop,colorBottom] : [UIColor.green.cgColor,UIColor.blue.cgColor] 
    self.state = !self.state 
    let anim = CABasicAnimation(keyPath: "colors") 
    anim.duration = 10 // or whatever 
    anim.fromValue = self.grad!.colors 
    anim.toValue = arr 
    anim.delegate = self 
    self.grad?.add(anim, forKey: nil) 
    DispatchQueue.main.async { 
     CATransaction.setDisableActions(true) 
     self.grad?.colors = arr 
    } 
} 
func animationDidStop(_ anim: CAAnimation, finished flag: Bool) { 
    DispatchQueue.main.async { 
     self.animate() 
    } 
}