2016-05-07 5 views
1

私は最初に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に挿入できないと推測しています。

グラデーションを変更する他の方法はありますか?

答えて

1

ViewWillAppear関数が機能するはずです。ビューがアクティブになるたびに呼び出されます。あなたのCAGradientLayer色は常にgLayer.colors = [UIColor.yellowColor().CGColor, UIColor.greenColor().CGColor]に設定されているので、

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated); 
} 

更新は
最初のもののみが表示されます。

色を変更したいときはいつでも、これをメモリに保存して、再度ビューに入るときにこれを知る必要があります。これは別の解決策です。

NSUserDefaultを作成して、表示する色を保存します。

let myCAGradientLayer = self.view.getMyGradient() 
if myCAGradientLayer.name == "my gradient layer" { 
    // do whatever you want with the same first gradient added 
} 

てみてください。あなたの勾配を取得するには

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() 
    } 
} 

を:あなたはサブレイヤからあなたの層を検索することができ

// 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

0

:ビューを表示すると

// 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" 

これを行いますあなたにsetNeedsDisplayを作る表示更新時に問題が発生した場合は、表示を再描画してください。

+0

これがどのように役立つか分かりません。 – 4thSpace

+0

あなたはどのようにグラデーションと問題viewWillAppearで行うかを切り替える方法に問題を表明している。だから今、あなたの更新後、それはより明確です、あなたはグラデーションを変更する必要があります、タイトルは理解できませんでした –

+1

私はまだあなたのコードがどのように役立たない。私のサンプルでは、​​常にインデックス= 0にグラデーションを挿入しています。ですから、唯一のグラデーションが必要です。私はいつも上書きする。私が何かを誤解していない限り。 – 4thSpace