#ios #swift #cagradientlayer
#iOS #swift #cagradientlayer
Вопрос:
Я хочу иметь возможность изменять цвета CAGradientLayer
в режиме реального времени со значениями, которые я получаю @IBAction
в основном ViewController
. UISlider
перемещается, цвет фона меняется. Я прошу теоретический подход.
Какой шаблон или метод используется для достижения этого? я действительно заблудился, и могучий Интернет не предоставил никакой полезной помощи.
-
Подклассифицировать a
UIView
и добавитьgradientLayer
туда? Затем просмотрите переменную с входящими значениями и позвольте KVO обновить записи массива (наборы цветов)cgColor
значениями? -
Создайте экземпляр
gradientLayer
в главномViewControlle
r и обновите его свойства цвета там, когда изменения значений поступают через@IBAction
?
Код помогает, но здесь он вторичен. я прошу больше теоретического решения. Я пытаюсь следовать MVC, но меня вряд ли смущает, где должен быть создан экземпляр gradientLayer, каков наилучший способ динамического изменения цветов и т.д. … открыть для ввода, спасибо
Ответ №1:
Используя очень простое расширение для 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 по своему усмотрению и манипулируйте их значениями с помощью ползунка. Надеюсь, это поможет
Комментарии:
1. Это тот ввод, который мне был нужен. Спасибо @Galo Torres Севилья. Я использую его с Swift 5 в Xcode 10.2, и он работает так, как должен. Мне не нужны все эти слайдеры, потому что я делаю это через раскадровку.
Ответ №2:
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)
}
}
Комментарии:
1. Мой
ViewController
после ответа от @Gallo Torres Севилья. Работает. Я использовалUIView
расширение без изменений.