2017-03-13 11 views
0

バックグラウンドUIViewでアプリ内でラジアルグラデーションを使用しようとしています。グラディエントのビューカラーを複数回更新したいという私の問題が浮かび上がってきます。コードに間違いはありませんが、これを回避する方法を見つけることはできません。UIViewでラジアルグラデーションの色が更新されない

私が試みたのは、通常のUIViewとグラデーションクラスの両方で入力ビューをリロードすることでした。 uiviewのサブビューを削除し、設定された色を変更するだけの新しいビューを画面に追加する。私はインターネットを見てきましたが、これを解決できないようです。私が望むのは、UIViewが私が与える新しいカラーパラメータに基づいてその色を更新することだけです。ここで

は私のラジアルgradienceコードです:私はそれを使用していますのはここ

import UIKit 

class RadialGradient: UIView { 


    var innerColor = UIColor.yellow 
    var outterColor = UIColor.red 

    override func draw(_ rect: CGRect) { 

     let colors = [innerColor.cgColor, outterColor.cgColor] as CFArray 
     let endRadius = min(frame.width, frame.height) 

     let center = CGPoint(x: bounds.size.width/2, y: bounds.size.height/2) 

     let gradient = CGGradient(colorsSpace: nil, colors: colors, locations: nil) 

     UIGraphicsGetCurrentContext()!.drawRadialGradient(gradient!, 
      startCenter: center, 
      startRadius: 0.0, 
      endCenter: center, 
      endRadius: endRadius, 
      options: CGGradientDrawingOptions.drawsAfterEndLocation) 


    } 

} 

は次のとおりです。

import UIKit 

class TestIssuesVC: UIViewController { 

    var check : Bool = false 

    @IBAction func buttonClicked(_ sender: Any) { 

     if check == true { 
      backgroundsetting.removeFromSuperview() 
      print("Why wont you change to purple and black?????") 
      cheapFix(inner: UIColor.purple, outter: UIColor.black) 

     } else { 

     backgroundsetting.removeFromSuperview() 

     cheapFix(inner: UIColor.red, outter: UIColor.blue) 
      check = true 
     } 
    } 

    func cheapFix(inner: UIColor, outter: UIColor) { 

     let backgroundsetting = RadialGradient() 

     backgroundsetting.innerColor = inner 
     backgroundsetting.outterColor = outter 

     backgroundsetting.frame = (frame: CGRect(x: self.view.frame.size.width * 0, y: self.view.frame.size.height * 0, width:self.view.frame.size.width, height: self.view.frame.size.height)) 
     self.view.addSubview(backgroundsetting) 
     self.view.sendSubview(toBack: backgroundsetting) 
     self.reloadInputViews() 




    } 
    let backgroundsetting = RadialGradient() 


    override func viewWillAppear(_ animated: Bool) { 
     backgroundsetting.innerColor = UIColor.green 
     backgroundsetting.outterColor = UIColor.red 

     backgroundsetting.frame = (frame: CGRect(x: self.view.frame.size.width * 0, y: self.view.frame.size.height * 0, width:self.view.frame.size.width, height: self.view.frame.size.height)) 
     self.view.addSubview(backgroundsetting) 
     self.view.sendSubview(toBack: backgroundsetting) 
     self.reloadInputViews() 

    } 


} 
+0

いつも古い画像を削除してから新しい画像を作成するのはなぜですか?そのビューの色を変更し、** setNeedDisplay **メソッドを呼び出すことができます。これは、ビューを再描画する必要があることをシステムに通知します。 – Sergey

答えて

0

は、私は2つのことを参照してください。

  1. cheapFixメソッドは、backgroundsettingプロパティを更新しません。同じ名前のローカル変数を作成します。あなたは実際に何度も何度も新しいビューを追加していますが、各ビューは最初に表示されるので、バックに送信されます。これが何も変わらないように見える理由です。
  2. これは必要ありません。 1つのRadialGradientビューを作成するだけです。色を変えたいときは、色を変更するだけです。そのクラスは、そのプロパティが更新されるときに再描画されるように修正する必要があります。

は、あなたのRadialGradientクラスで2つのプロパティに次のように変更します。

var innerColor = UIColor.yellow { 
    didSet { 
     setNeedsDisplay() 
    } 
} 
var outterColor = UIColor.red { 
    didSet { 
     setNeedsDisplay() 
    } 
} 

これらの変更は、その色が更新されるとビュー自体を再描画するようになります。

+0

ありがとうございました!!!!私はsetNeedsDisplay()関数があることを知らなかった。私は文字通りこれにしばらくはまっています。どうもありがとうございます!! –

関連する問題