Измените цвета CAGradientLayer с помощью ползунка в реальном времени - PullRequest
0 голосов
/ 28 марта 2019

Я хочу иметь возможность изменить цвет CAGradientLayer в режиме реального времени со значениями, которые я получаю более @IBAction в основном ViewController.UISlider движется, цвет меняется на фоне.Я спрашиваю о теоретическом подходе.

Какая модель или методика использовались для достижения этой цели?я действительно заблудился, и могучий интернет не показал никакой полезной помощи.

  • Подклассы UIView и добавление туда gradientLayer?Затем просмотрите переменную с входящими значениями и позвольте KVO обновить записи массива (наборы цветов) с cgColor значениями?

  • Создайте gradientLayer в основном ViewControlle r иобновите свои свойства цвета там, когда изменения значений приходят через @IBAction?

Код помогает, но его вторичность здесь.я прошу больше для теоретического решения.Я пытаюсь следовать MVC, но меня не смущает, где должен быть создан экземпляр градиента, каков наилучший способ динамического изменения цвета… открыть для ввода, thx

Ответы [ 2 ]

0 голосов
/ 29 марта 2019
class ViewController: UIViewController {

    var gradientLayer = CAGradientLayer()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        gradientLayer.bounds = self.view.bounds
        self.view.layer.insertSublayer(gradientLayer, at: 0)
    }

    // Slider Input
    @IBAction func sliderValueChanged(_ sender: UISlider) {
        self.view.addColorGradient(value: CGFloat(sender.value), gradientLayer: gradientLayer)
    }
}
0 голосов
/ 28 марта 2019

Используя очень простое расширение для UIView, вы можете получить то, что вам нужно. Вот краткий пример использования полустатических цветов просто для простоты, но вы можете расширить его по мере необходимости.

extension UIView {
    /**
     Adds colors to a CAGradient Layer.
     - Parameter value: The Float coming from the slider.
     - Parameter gradientLayer: The CAGradientLayer to change the colors.
     */
    func addColorGradient (value: CGFloat, gradientLayer: CAGradientLayer) {
        let topColor = UIColor(red: value / 255, green: 1, blue: 1, alpha: 1)
        let bottomColor = UIColor(red: 1, green: 1, blue: value / 255, alpha: 1)
        gradientLayer.colors = [topColor.cgColor, bottomColor.cgColor]
    }
}

Пример использования:

import UIKit

class ViewController: UIViewController {

    let slider : UISlider = {
        let slider = UISlider(frame: .zero)
        slider.maximumValue = 255
        slider.minimumValue = 0.0
        return slider
    }()

    var gradientLayer = CAGradientLayer()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.addSubview(slider)
        slider.translatesAutoresizingMaskIntoConstraints = false
        slider.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true
        slider.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
        slider.widthAnchor.constraint(equalToConstant: 200).isActive = true
        slider.heightAnchor.constraint(equalToConstant: 20).isActive = true
        slider.addTarget(self, action: #selector(sliderValueChanged), for: .valueChanged)
        gradientLayer.bounds = self.view.bounds
        self.view.layer.insertSublayer(gradientLayer, at: 0)
    }

    @objc func sliderValueChanged(sender: UISlider) {
        let currentValue = CGFloat(sender.value)
        self.view.addColorGradient(value: currentValue, gradientLayer: gradientLayer)
    }

}

Просто измените topColor и bottomColor, как вам нужно, и управляйте их значениями с помощью ползунка. Надеюсь, это поможет

...