如何切换CAGradientLayer?
问题描述:
我最初在viewDidLoad的第一个场景中创建一个CAGradientLayer
。它是这样插入的:如何切换CAGradientLayer?
self.view.layer.insertSublayer(myCAGradientLayer, atIndex: 0)
工作正常。但现在我需要在应用程序运行时更改渐变。用户将在场景2上执行某些操作,然后返回场景1,在该场景中渐变会发生变化。我建立了一个新的CAGradientLayer
并添加到与上面相同的视图。
但使用viewWillAppear不起作用。
下面是一个例子:
let gLocations: [Float] = [0.0, 1.0]
let gLayer: CAGradientLayer = CAGradientLayer()
gLayer.colors = [UIColor.yellowColor().CGColor, UIColor.greenColor().CGColor]
gLayer.frame = self.view.bounds
gLayer.locations = gLocations
self.view.layer.insertSublayer(gLayer, atIndex: 0)
以上添加到viewWillAppear中。然后使用不同的颜色将它添加到多个条件中。只有第一个条件选择出现。没有出现其他条件中的任何其他颜色。
我认为这个问题的部分是,我总是这样做的:
self.view.layer.insertSublayer(gLayer, atIndex: 0)
否则,渐变将出现在其他UI组件之上。我使用几种不同的渐变,他们都使用上面的代码。但我猜他们都不能插入索引= 0。
有没有其他的方法来改变渐变?
答
ViewWillAppear
函数应该工作。每当视图即将激活时,它都会被调用。
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated);
}
更新
第一种是只显示因为你CAGradientLayer
颜色一直被设置为gLayer.colors = [UIColor.yellowColor().CGColor, UIColor.greenColor().CGColor]
。
无论何时你想改变颜色,你都需要将它保存在内存中,以便在你再次进入视图时知道这一点。这是一个替代解决方案。
创建一个NSUserDefault
以保存要显示的颜色。
// Set - set a new color whenever you want this to be displayed when you show the view next time
// forKey is the unique value to access the object you have saved
NSUserDefaults.standardUserDefaults().setObject("red", forKey: "color"
当显示视图做到这一点:
// Get
let color = NSUserDefaults.standardUserDefaults().stringForKey("color")
if color == "red"{
gLayer.colors = [UIColor.redColor().CGColor, UIColor.blueColor().CGColor]
}
else if...
答
您可以从子层搜索您层:
myCAGradientLayer.name = "my gradient layer"
...
extension UIView {
func getMyGradient(name:String) -> CAGradientLayer {
if let layers = self.layer.sublayers {
for layer in layers {
if (layer.name == name) {
let caGradientLayer = layer as! CAGradientLayer
return caGradientLayer
}
}
}
print("Sorry your gradient doesnt exist in this view..")
return CAGradientLayer()
}
}
要检索梯度:
let myCAGradientLayer = self.view.getMyGradient()
if myCAGradientLayer.name == "my gradient layer" {
// do whatever you want with the same first gradient added
}
尝试让你的setNeedsDisplay
查看,重新呈现自己,如果有显示更新周围的问题..
我已经添加了一些示例代码的OP。在viewWillAppear中使用不同颜色的条件添加几次。如果你想添加一个计数器,你可以在不同的条件(和颜色)之间切换。 – 4thSpace
@ 4thSpace,如果我理解你的问题的权利:你有一个渐变颜色,当用户转到另一个视图,然后回来,你想改变渐变颜色到另一个? –
是的。有3种不同的渐变参与。但就像我说的,只有第一个显示。 – 4thSpace