2017-03-23 12 views
0

Storyboardを使用してCAGradientLayerに4つのUIColorsを設定するクラスがあります。Swiftでカスタムセッターを使用して配列プロパティを更新する

私は、ストーリーボードから設定されているUIColorsを追跡するために配列を使用しています。

ユーザーが色を設定すると、その色を配列に追加し、色を何も設定していない場合(それは可能ですか?)、配列から色を削除します。

グラデーションレイヤーの色は、2〜4色です。

以下のコードは私が思いついたものですが、私はできるだけクリーナーを探しています。

class ViewController: UIViewController { 

    var gradientLayer = CAGradientLayer() 
    var gradientColors = [UIColor]() 


    @IBInspectable var color1Value: UIColor? 
     { 
     didSet { 
      self.updateGradientLayer() 
     } 
    } 

    @IBInspectable var color2Value: UIColor? { 
     didSet { 
      self.updateGradientLayer() 
     } 
    } 

    @IBInspectable var color3Value: UIColor? { 
     didSet { 
      self.updateGradientLayer() 
     } 
    } 

    @IBInspectable var color4Value: UIColor? { 
     didSet { 
      self.updateGradientLayer() 
     } 
    } 


    func updateGradientLayer() { 
     gradientColors.removeAll() 
     gradientColors.append(color1Value!) 
     gradientColors.append(color2Value!) 
     gradientColors.append(color3Value!) 
     gradientColors.append(color4Value!) 

     gradientLayer.colors = gradientColors 
    } 



    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

答えて

0

私はCAGradientLayerの使用に慣れていないが、私は、オプションの色の実際の配列を作成し、欠落している色の値を排除するためにflatMapを使用することをお勧めします。このようなもの。

var gradientLayer = CAGradientLayer() 
var gradientColors: [UIColor?] = [nil, nil, nil, nil] { 
    didSet { 
    gradientLayer.colors = gradientColors.flatMap { $0 } 
    } 
} 

次に、gradientColors配列にインデックスでアクセスし、インデックスを変更するとグラデーションレイヤが更新されます。

viewController.gradientColors[1] = .red 
viewController.gradientColors = [.black, nil, .blue, .yellow] 

私の元の返信は、各色がIBInspectableであるという要件を処理しませんでした。必要に応じて、このようなことをすることができますが、今ではほぼ同じ数のコード行に戻ります。

@IBInspectable var gradientColor1: UIColor? { 
    didSet { 
    gradientColors[0] = gradientColor1 
    } 
} 
// ... for other colors. 
関連する問題