从另一个类Delagate

时间:2016-09-23 22:04:16

标签: ios swift xcode colors color-picker

我正在尝试在我的应用中实现类HSBColorPicker。我有所有编译和运行的东西,就像我想要的那样,但我被卡住的地方是尝试从HSBColorPicker类中获取颜色信息并在其他类中使用它。以下是我的应用程序现在的样子:

Color Picker App

我的目标是用户触摸顶部色域的任何位置,然后选择颜色并设置为当前颜色。颜色选择器的代码工作,我的视图控制器的代码也是如此。基本上我无法弄清楚的是如何通过点击频谱来检索用户选择的UIColor。更具体地说,我需要从UIColor中提取红色,绿色和蓝色值。

一旦我拥有了这些值,我就可以从那里获取它但是我很难过如何从我的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()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

非常感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

import java.util.Scanner; public class absolutevalue { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print(" Type in a number "); int num = input.nextInt(); // for Int. String str = input.next(); // for String. String str = input.nextLine(); // for line of String. double num = input.nextDouble(); // for double. float str = input.nextFloat(); // for float. if (num <0){ num = num * -1; } System.out.println("The absolute value is " + num); input.close(); } } 确认ColorsViewController。并实现该方法并将值存储在HSBColorPickerDelegate中。另外,我没有看到您使用ColorsViewController中的HSBColorPicker