私のアプリでHSBColorPickerクラスを実装しようとしています。私はすべてのことをコンパイルして実行していますが、この時点までにしたいのですが、私が立ち往生しているところでは、HSBColorPickerクラスから色情報を取得し、それを他のクラスで使用しようとしています。ここに私のアプリは今のように見えるものです:別のクラスからUIColorを取得しています。
私の目標は、ユーザーが上部の色のスペクトル上の任意の場所に触れると、その色が選択されますと、現在の色に設定されていることです。カラーピッカーのコードは、ビューコントローラのコードと同様に機能します。基本的に私が把握できないのは、スペクトルをタップしてユーザが選択した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.
}
}
であるあなたが提供することができます任意の助けをありがとうございました!
"確認する"とは何ですか?私はクラスでまだ使用していません。それは、どうやってやるのか分かります。 HSBColorPickerは、ストーリーボードのColorピッカービューコントローラーで使用されるUIViewのクラスです。 – BLF0005
ストーリーボードへのビューの追加を完了し、コンセントを 'ColorsViewController'に接続します。 'ColorsViewController:UIViewController:UIViewController'を' ColorsViewController:HSBColorPickerDelegate'として記述することができます。 'ColorsViewController'の' viewDidload'に 'hsbColorPicker.delegate = self'をセットします。 hsbColorPickerはコンセント名です。あなたの 'ColorsViewController'は' func HSBColorColorPickerTouched(送信者:HSBColorPicker、色:UIColor、ポイント:CGPoint、状態:UIGestureRecognizerState) 'を実装しています。 –
委任についてもっと読むには、https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID276 –