簡體   English   中英

如何切換CAGradientLayer?

[英]How to switch CAGradientLayer?

我最初在viewDidLoad的第一個場景上創建一個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組件的頂部。 我正在使用幾種不同的漸變,它們都使用上面的代碼。 但是我猜它們都不能插入到index = 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成為您的視圖,如果在顯示更新方面存在問題,則重新渲染自身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM