【问题标题】:RGB slider color showing in grayscale instead of in colorRGB 滑块颜色以灰度而不是彩色显示
【发布时间】:2020-06-14 22:51:30
【问题描述】:

我正在以编程方式制作一个 RGB 滑块,但我遇到了一个问题,我似乎无法弄清楚如何正确地将每个滑块的颜色显示为 UIColor。我已经改变了盒子里的颜色,但是它们是灰度的,我不明白为什么。

查看类:

extension UIView {
    func colorSlider(tintColor: UIColor) -> UISlider {
        let slider = UISlider()
        slider.minimumValue = 0
        slider.maximumValue = 255
        slider.isContinuous = true
        slider.tintColor = tintColor
        slider.frame.size = CGSize(width: 250, height: 20)
        return slider
    }
}

class SliderView: UIView {

    let stackView: UIStackView
    let redColorSlider = UIView().colorSlider(tintColor: .red)
    let greenColorSlider = UIView().colorSlider(tintColor: .green)
    let blueColorSlider = UIView().colorSlider(tintColor: .blue)

    let previewColorButton: UIButton = {
        let button = UIButton()
        button.frame.size = CGSize(width: 80, height: 100)
        return button
    }()

    override init(frame: CGRect) {
        self.stackView = UIStackView(arrangedSubviews: [redColorSlider, greenColorSlider, blueColorSlider])
        stackView.distribution = .fillEqually
        stackView.spacing = 15
        stackView.axis = .vertical

        super.init(frame: frame)

        setupLayout()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    fileprivate func setupLayout() {
        backgroundColor = .white

        addSubview(previewColorButton)
        previewColorButton.anchor(left: leftAnchor, paddingLeft: 20, width: 80, height: 100)
        previewColorButton.centerY(inView: self)

        addSubview(stackView)
        stackView.anchor(left: previewColorButton.rightAnchor, paddingLeft: 20, paddingRight: 20, width: 250)
        stackView.centerY(inView: self)

    }
}


控制器类:

class SliderController: UIViewController {

    let sliderView = SliderView()
    let step: Float = 0.1
    let redLabel = UIView().rgbLabel()
    var redValue: CGFloat = 0
    let greenLabel = UIView().rgbLabel()
    var greenValue: CGFloat = 0
    let blueLabel = UIView().rgbLabel()
    var blueValue: CGFloat = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        view = sliderView

        redLabel.text = "0"
        greenLabel.text = "0"
        blueLabel.text = "0"
        sliderView.previewColorButton.backgroundColor = .blue

        sliderView.redColorSlider.addTarget(self, action: #selector(sliderValueChanged(sender:)), for: .valueChanged)
        sliderView.greenColorSlider.addTarget(self, action: #selector(sliderValueChanged(sender:)), for: .valueChanged)
        sliderView.blueColorSlider.addTarget(self, action: #selector(sliderValueChanged(sender:)), for: .valueChanged)
        sliderView.previewColorButton.addTarget(self, action: #selector(sliderValueChanged(sender:)), for: .valueChanged)

        let stackView = UIStackView(arrangedSubviews: [redLabel, greenLabel, blueLabel])
        stackView.distribution = .fillEqually
        stackView.spacing = 5

        view.addSubview(stackView)
        stackView.anchor(bottom: view.safeAreaLayoutGuide.bottomAnchor)
        stackView.centerX(inView: view)
    }

    @objc func sliderValueChanged(sender: UISlider) {
        redValue = CGFloat(round(sender.value / step) * step)
        greenValue = CGFloat(round(sender.value / step) * step)
        blueValue = CGFloat(round(sender.value / step) * step)
        redLabel.text = "\(Int(redValue))"
        greenLabel.text = "\(Int(greenValue))"
        blueLabel.text = "\(Int(blueValue))"

        sliderView.previewColorButton.backgroundColor = UIColor(red: redValue/255, green: greenValue/255, blue: blueValue/255, alpha: 1.0)
    }

我尝试将滑块操作功能 @objc func sliderValueChanged 与每个单独的滑块操作分开,如下所示:

    @objc func redSliderValueDidChange(sender: UISlider) {
        let redSliderValue = round(sender.value / step) * step
        redValue = CGFloat(redSliderValue)
        redLabel.text = "\(Int(redValue))"
    }

    @objc func greenSliderValueDidChange(sender: UISlider) {
        let greenSliderValue = round(sender.value / step) * step
        greenValue = CGFloat(greenSliderValue)
        greenLabel.text = "\(Int(greenValue))"
    }

    @objc func blueSliderValueDidChange(sender: UISlider) {
        let blueSliderValue = round(sender.value / step) * step
        blueValue = CGFloat(blueSliderValue)
        blueLabel.text = "\(Int(blueValue))"
    }

这有助于使每个颜色标签单独更改,而不是我上面的内容,但颜色不会改变。

目前的样子:

我还没有找到有关如何以编程方式执行此操作的任何信息,因此感谢您的帮助!

【问题讨论】:

    标签: swift uislider uicolor


    【解决方案1】:

    请检查您添加到滑块的目标。

    另外,您可以在代码中替换以下方法:

    @objc func sliderValueChanged(sender: UISlider)
    {
        sliderView.previewColorButton.backgroundColor = UIColor(red: CGFloat(redSliderValue/255), green: CGFloat(greenSliderValue/255), blue: CGFloat(blueSliderValue/255), alpha: 1.0)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多