【问题标题】:Retrieving UIColor from another class Delegate从另一个类 Delegate 中检索 UIColor
【发布时间】:2016-09-23 22:04:15
【问题描述】:

我正在尝试在我的应用程序中实现 HSBColorPicker 类。到目前为止,我已经按照我想要的方式编译和运行了所有东西,但我遇到的困难是试图从 HSBColorPicker 类中获取颜色信息并将其用于我的其他类中。这是我的应用现在的样子:

Color Picker App

我的目标是用户触摸顶部色谱上的任何位置,然后选择该颜色并将其设置为当前颜色。颜色选择器的代码有效,我的视图控制器的代码也有效。基本上我无法弄清楚的是如何通过点击光谱来检索用户选择的 UIColor。更具体地说,我需要从该 UIColor 中提取 Red、Green 和 Blue 值。

一旦我有了这些值,我就可以从那里获取它,但是对于如何从 ColorsViewController 类中的 HSBColorPicker 类中获取 UIColor 感到困惑。

这是 HSBColorPicker 类:

//
//  HSBColorPicker.swift
//  LED Ring App
//
//  Created by Blake Fabiani on 9/22/16.
//  Copyright © 2016 Blake Fabiani. All rights reserved.
//
import UIKit

internal protocol HSBColorPickerDelegate : NSObjectProtocol {
    func HSBColorColorPickerTouched(sender:HSBColorPicker, color:UIColor, point:CGPoint, state:UIGestureRecognizerState)
}

@IBDesignable
class HSBColorPicker : UIView {

    weak internal var delegate: HSBColorPickerDelegate?
    let saturationExponentTop:Float = 2.0
    let saturationExponentBottom:Float = 1.3

    @IBInspectable var elementSize: CGFloat = 1.0 {
        didSet {
            setNeedsDisplay()
        }
    }

    private func initialize() {
        self.clipsToBounds = true
        let touchGesture = UILongPressGestureRecognizer(target: self, action: #selector(HSBColorPicker.touchedColor(_:)))
        touchGesture.minimumPressDuration = 0
        touchGesture.allowableMovement = CGFloat.greatestFiniteMagnitude
        self.addGestureRecognizer(touchGesture)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        initialize()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        initialize()
    }

    override func draw(_ rect: CGRect) {
        let context = UIGraphicsGetCurrentContext()

        for y in stride(from: 0, to: rect.height, by: elementSize) {

            var saturation = y < rect.height / 2.0 ? CGFloat(2 * y) / rect.height : 2.0 * CGFloat(rect.height - y) / rect.height
            saturation = CGFloat(powf(Float(saturation), y < rect.height / 2.0 ? saturationExponentTop : saturationExponentBottom))
            let brightness = y < rect.height / 2.0 ? CGFloat(1.0) : 2.0 * CGFloat(rect.height - y) / rect.height

            for x in stride(from: 0, to: rect.width, by: elementSize) {
                let hue = x / rect.width
                let color = UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: 1.0)
                context!.setFillColor(color.cgColor)
                context!.fill(CGRect(x:x, y:y, width:elementSize,height:elementSize))
            }
        }
    }

    func getColorAtPoint(point:CGPoint) -> UIColor {
        let roundedPoint = CGPoint(x:elementSize * CGFloat(Int(point.x / elementSize)),
            y:elementSize * CGFloat(Int(point.y / elementSize)))
        var saturation = roundedPoint.y < self.bounds.height / 2.0 ? CGFloat(2 * roundedPoint.y) / self.bounds.height
            : 2.0 * CGFloat(self.bounds.height - roundedPoint.y) / self.bounds.height
        saturation = CGFloat(powf(Float(saturation), roundedPoint.y < self.bounds.height / 2.0 ? saturationExponentTop : saturationExponentBottom))
        let brightness = roundedPoint.y < self.bounds.height / 2.0 ? CGFloat(1.0) : 2.0 * CGFloat(self.bounds.height - roundedPoint.y) / self.bounds.height
        let hue = roundedPoint.x / self.bounds.width
        return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: 1.0)
    }

    func getPointForColor(color:UIColor) -> CGPoint {
        var hue:CGFloat=0;
        var saturation:CGFloat=0;
        var brightness:CGFloat=0;
        color.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: nil);

        var yPos:CGFloat = 0
        let halfHeight = (self.bounds.height / 2)

        if (brightness >= 0.99) {
            let percentageY = powf(Float(saturation), 1.0 / saturationExponentTop)
            yPos = CGFloat(percentageY) * halfHeight
        } else {
            //use brightness to get Y
            yPos = halfHeight + halfHeight * (1.0 - brightness)
        }

        let xPos = hue * self.bounds.width

        return CGPoint(x: xPos, y: yPos)
    }

    func touchedColor(_ gestureRecognizer: UILongPressGestureRecognizer){
        let point = gestureRecognizer.location(in: self)
        let color = getColorAtPoint(point: point)

        self.delegate?.HSBColorColorPickerTouched(sender: self, color: color, point: point, state:gestureRecognizer.state)
    }
}

这是 ColorsViewController

//
//  ColorsViewController.swift
//  LED Ring App
//
//  Created by Blake Fabiani on 9/13/16.
//  Copyright © 2016 Blake Fabiani. All rights reserved.
//

import UIKit

var redColor: float_t = 0
var greenColor: float_t = 0
var blueColor: float_t = 0

class ColorsViewController: UIViewController {

    @IBOutlet weak var redSlider: UISlider!
    @IBOutlet weak var greenSlider: UISlider!
    @IBOutlet weak var blueSlider: UISlider!

    @IBOutlet weak var ColorPickerImageView: UIImageView!

    @IBOutlet weak var redColorLabel: UILabel!
    @IBOutlet weak var greenColorLabel: UILabel!
    @IBOutlet weak var blueColorLabel: UILabel!

    @IBOutlet weak var currentColorButton: UIButton!

    @IBAction func redSliderAction(_ sender: UISlider) {
        changeColors()
    }
    @IBAction func greenSliderAction(_ sender: UISlider) {
        changeColors()
    }
    @IBAction func blueSliderAction(_ sender: UISlider) {
        changeColors()
    }

    func chageCurrentColorImage() {
        currentColorButton.backgroundColor = UIColor(red: CGFloat(redColor/Float(255.0)), green: CGFloat(greenColor/Float(255)), blue: CGFloat(blueColor/Float(255)), alpha: 1.0)
        changeSliderLabel()
    }
    func changeColors() {
        redColor = redSlider.value
        greenColor = greenSlider.value
        blueColor = blueSlider.value
        chageCurrentColorImage()
    }

    func changeSliderValue() {
        redSlider.value = redColor
        greenSlider.value = greenColor
        blueSlider.value = blueColor
    }

    func changeSliderLabel() {
        let roundedRed = String(format: "%0.0f",(redColor))
        let roundedGreen = String(format: "%0.0f",(greenColor))
        let roundedBlue = String(format: "%0.0f",(blueColor))
        redColorLabel.text = "Red: \(roundedRed)"
        greenColorLabel.text = "Green: \(roundedGreen)"
        blueColorLabel.text = "Blue: \(roundedBlue)"

    }

    override func viewDidLoad() {
        super.viewDidLoad()
        chageCurrentColorImage()
        changeSliderValue()
    }
}

【问题讨论】:

    标签: ios swift colors color-picker


    【解决方案1】:

    ColorsViewController 确认为HSBColorPickerDelegate。并实现该方法并将值存储在ColorsViewController 中。另外,我没有看到您在ColorsViewController 中使用HSBColorPicker

    【讨论】:

    • 你是什么意思“确认”,我还没有在课堂上使用它,这就是我试图弄清楚如何做的事情。 HSBColorPicker 是用于故事板中颜色选择器视图控制器的 UIView 的类。
    • 完成将视图添加到情节提要,将插座连接到ColorsViewController。您可以将ColorsViewController: UIViewController 编码为ColorsViewController: UIViewController, HSBColorPickerDelegate。在viewDidloadColorsViewController 中设置hsbColorPicker.delegate = self。这里 hsbColorPicker 是插座名称。在您的ColorsViewController 中实现func HSBColorColorPickerTouched(sender:HSBColorPicker, color:UIColor, point:CGPoint, state:UIGestureRecognizerState)
    • 要了解更多关于委托的信息,developer.apple.com/library/content/documentation/Swift/…
    猜你喜欢
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 2011-07-13
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    相关资源
    最近更新 更多