我希望能够实时更改CAGradientLayer
的颜色,而我在主@IBAction
中通过ViewController
接收到的值。 UISlider
移动,背景颜色改变。我要求一种理论方法。
用于实现此目的的模式或技术是什么?我真的迷路了,强大的互联网没有提供任何有用的帮助。
将UIView
子类化并在其中添加gradientLayer
吗?然后观察带有输入值的变量,并让KVO用cgColor
值更新数组条目(颜色集)?
在主gradientLayer
中实例化ViewControlle
,并在通过@IBAction
进行值更改时在那里更新其颜色属性?
代码有帮助,但此处是次要的。我要求更多的理论解决方案。我尝试遵循MVC,但是我几乎不应该在哪里实例化gradientLayer感到困惑,如何动态更改颜色的最佳方法是什么? 打开输入,thx
答案 0 :(得分:0)
使用非常简单的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 :(得分:0)
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)
}
}