如何切换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... 
+0

我已经添加了一些示例代码的OP。在viewWillAppear中使用不同颜色的条件添加几次。如果你想添加一个计数器,你可以在不同的条件(和颜色)之间切换。 – 4thSpace

+0

@ 4thSpace,如果我理解你的问题的权利:你有一个渐变颜色,当用户转到另一个视图,然后回来,你想改变渐变颜色到另一个? –

+0

是的。有3种不同的渐变参与。但就像我说的,只有第一个显示。 – 4thSpace

您可以从子层搜索您层:

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查看,重新呈现自己,如果有显示更新周围的问题..

+0

我不知道这是如何帮助。 – 4thSpace

+0

先生你已经表达了如何切换你的梯度和问题如何在viewWillAppear中做的问题。所以,现在,更新之后,更清楚的是,您必须更改渐变,标题不可理解 –

+1

我仍然不知道您的代码如何提供帮助。你可以在我的示例中看到,我总是在索引= 0插入渐变。所以应该只有一个渐变。我总是覆盖。除非我误解了一些东西。 – 4thSpace