【问题标题】:Updating Array Property Using Custom Setters in Swift 3.1在 Swift 3.1 中使用自定义设置器更新数组属性
【发布时间】:2017-08-16 14:13:24
【问题描述】:

我有一个班级,我想使用 Storyboard 为 CAGradientLayer 设置最多 4 个 UIColors。

我正在使用一个数组来跟踪从情节提要中设置的 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.
    }
}

【问题讨论】:

    标签: ios arrays swift properties setter


    【解决方案1】:

    我不熟悉 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2021-07-08
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      相关资源
      最近更新 更多