2016-09-23 30 views
0

私のアプリでHSBColorPickerクラスを実装しようとしています。私はすべてのことをコンパイルして実行していますが、この時点までにしたいのですが、私が立ち往生しているところでは、HSBColorPickerクラスから色情報を取得し、それを他のクラスで使用しようとしています。ここに私のアプリは今のように見えるものです:別のクラスからUIColorを取得しています。

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. 
} 


} 

であるあなたが提供することができます任意の助けをありがとうございました!

答えて

0

ColorsViewControllerHSBColorPickerDelegateに確認してください。その方法を実装し、値をColorsViewControllerに格納します。また、HSBColorPickerColorsViewControllerに使用しているとは思われません。

+0

"確認する"とは何ですか?私はクラスでまだ使用していません。それは、どうやってやるのか分かります。 HSBColorPickerは、ストーリーボードのColorピッカービューコントローラーで使用されるUIViewのクラスです。 – BLF0005

+0

ストーリーボードへのビューの追加を完了し、コンセントを 'ColorsViewController'に接続します。 'ColorsViewController:UIViewController:UIViewController'を' ColorsViewController:HSBColorPickerDelegate'として記述することができます。 'ColorsViewController'の' viewDidload'に 'hsbColorPicker.delegate = self'をセットします。 hsbColorPickerはコンセント名です。あなたの 'ColorsViewController'は' func HSBColorColorPickerTouched(送信者:HSBColorPicker、色:UIColor、ポイント:CGPoint、状態:UIGestureRecognizerState) 'を実装しています。 –

+0

委任についてもっと読むには、https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID276 –

関連する問題