2017-02-13 4 views
0

CAGradientレイヤーを作成してうまく動作するUIViewに挿入するクラス関数があります。挿入後にCAGradientLayerの色を変更する

ただし、ページが表示された後にグラデーションを変更して、同じ機能を再実行しても機能しません。

表示されたページでは、スライダを使用して2つのUIButtonの背景に新しい色を設定し、以下の関数を呼び出します。スライダを変更したときにグラデーションレイヤの背景が変わることが予想されますが、スライダは変更されません。関数が呼び出され、色の値が有効であることを確認しました。

スライダを動かすと、どのようにグラデーションを変更できますか?

はここで、クラスの機能です:

class func setGradientBG(_ firstColor: CGColor, secondColor: CGColor, vertical: Bool, thisView: UIView){ 
    let gradientLayer = CAGradientLayer() 
    gradientLayer.frame = thisView.bounds 
    gradientLayer.colors = [firstColor, secondColor] 
    gradientLayer.locations = [0.0, 1.2] 
    if !vertical{ 
     gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0) 
     gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.0) 
    } 
    thisView.layer.insertSublayer(gradientLayer, at: 0) 
} 

そして、ここでスライダーから呼び出される関数です:

func doSlider(){ 
    CommonFuncs.setGradientBG((self.TopColorBut.backgroundColor?.cgColor)!, secondColor: (self.BottomColorBut.backgroundColor?.cgColor)!, vertical: true, thisView: self.view) 
} 
+0

は、 'doSlider'メソッドが含まれているどのようなクラスthisView.layer.setNeedsDisplay() – Idali

+0

を使うのか?グラデーションをいくつ追加していますか? 'setGradientBG'はなぜクラスメソッドですか? –

答えて

0

setGradientBGに電話するたびにCAGradientLayerという別のインスタンスが追加されます。それは本当に良いアイデアだと思いますか?

あなたのdoSliderメソッドはおそらくカスタムUIViewControllerサブクラスの一部であるようです。ビューコントローラにグラデーションレイヤへの参照を保存し、既存のレイヤを更新する必要があります。例:

class ViewController: UIViewController { 

    private let gradientLayer = CAGradientLayer() 

    @IBOutlet var topColorButton: UIButton! 
    @IBOutlet var bottomColorButton: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     view.layer.insertSublayer(gradientLayer, at: 0) 
     self.updateGradientLayer() 
    } 

    @IBAction func doSlider() { 
     updateGradientLayer() 
    } 

    private func updateGradientLayer() { 
     gradientLayer.locations = [ 0.0, 1.2 ] 
     gradientLayer.startPoint = .zero 
     gradientLayer.endPoint = CGPoint(x: 0, y: 1) 
     gradientLayer.colors = [ 
      (topColorButton.backgroundColor ?? .clear).cgColor, 
      (bottomColorButton.backgroundColor ?? .clear).cgColor ] 
    } 

    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 
     gradientLayer.frame = view.bounds 
    } 

} 
+0

私はそれについて疑問を抱いていました。コードを変更して、レイヤーがビューコントローラーに追加され、共通の機能を介して変更されるようにします。 – wayneh

0

副層は、フロントために後ろに記載されています。最後に新しいサブレイヤを挿入してください。古いものを取り除く。

+0

アドバイスをいただきありがとうございますが、私はロブが以下の答えを持っていると思います。追加されたレイヤーへの参照を保持できるように、関数を書き直す必要があります。 – wayneh

関連する問題