Мне очень трудно заставить работать палитру цветов. После того, как я не смог заставить его делегировать какую-либо информацию обратно на вызов, я попробовал следующее:
UIViewController с именем VCColorPicker.swift для UIViewController
UIView подключен к HSBColorPicker.swift.
Ниже приведен код для VCColorPicker.swift (UIViewController).
import UIKit
class VCColorPicker :UIViewController {
@IBOutlet weak var LabelColor: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
print("VCColorPicker loaded")
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Цель состоит в том, что я получаю, щелкнув UIView, цвет, который записывается в BackgroundColor метки «LabelColor», которая помещается в VCColorPicker.
К сожалению, возникают две проблемы: во-первых, окно не строится с последней строкой, в которой я пытаюсь заполнить LabelColor. (Приложение не создается) Если я вытащу его, экран для VCColorPicker не загрузится со следующим кодом ошибки.
17.02.2016 22:47:27.798 MagicACC[13202:2720420] Неизвестный класс HSBColorPicker в файле построителя интерфейсов. VCColorPicker загружен 2016-02-17 22:47:27.806 MagicACC[13202:2720420] * Завершение работы приложения из-за необработанного исключения 'NSInvalidArgumentException', причина: '* -CGColor не определен для UIColor ; необходимо сначала преобразовать цветовое пространство.
Вот код для HSBColorPicker, который я нашел здесь на странице и попытался адаптировать.
import UIKit
internal protocol HSBColorPickerDelegate : NSObjectProtocol {
func HSBColorColorPickerTouched(sender:HSBColorPicker, color:UIColor, point:CGPoint, state:UIGestureRecognizerState)
}
@IBDesignable
class HSBColorPicker: UIView {
@IBInspectable var elementSize: CGFloat = 1.0 {
didSet {
setNeedsDisplay()
}
}
private func initialize() {
print("HSCColorPicker loaded - initialize start")
self.clipsToBounds = true
let touchGesture = UILongPressGestureRecognizer(target: self, action: "touchedColor:")
touchGesture.minimumPressDuration = 0
touchGesture.allowableMovement = CGFloat.max
self.addGestureRecognizer(touchGesture)
print("HSCColorPicker loaded - initialize stop")
}
override init(frame: CGRect) {
super.init(frame: frame)
initialize()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initialize()
}
override func drawRect(rect: CGRect) {
print("HSCColorPicker loaded - drawRect start")
let context = UIGraphicsGetCurrentContext()
for var y = CGFloat(0.0); y < rect.height; y=y+elementSize {
let saturation = y < rect.height / 2.0 ? CGFloat(2 * y) / rect.height : CGFloat(1.0)
let brightness = y < rect.height / 2.0 ? CGFloat(1.0) : 2.0 * CGFloat(rect.height - y) / rect.height
for var x = CGFloat(0.0); x < rect.width; x=x+elementSize {
let hue = x / rect.width
let color = UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: 1.0)
CGContextSetFillColorWithColor(context, color.CGColor)
CGContextFillRect(context, CGRect(x:x, y:y, width:elementSize,height:elementSize))
print("HSCColorPicker loaded - drawRect stop")
}
}
}
func getColorAtPoint(point:CGPoint) -> UIColor {
print("HSCColorPicker loaded - getColorAtPoint start")
let roundedPoint = CGPoint(x:elementSize * CGFloat(Int(point.x / elementSize)),
y:elementSize * CGFloat(Int(point.y / elementSize)))
let saturation = roundedPoint.y < self.bounds.height / 2.0 ? CGFloat(2 * roundedPoint.y) / self.bounds.height : CGFloat(1.0)
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
print("HSCColorPicker loaded - getColorAtPoint stop")
return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: 1.0)
}
func touchedColor(gestureRecognizer: UILongPressGestureRecognizer){
let vPoint = gestureRecognizer.locationInView(self)
vColor = getColorAtPoint(vPoint)
VCColorPicker.LabelColor.backgroundcolor = vColor
}
}
Я был бы очень признателен, если бы кто-нибудь сказал мне, как мне нужно изменить код, чтобы это действительно работало. Заранее спасибо. Может быть, вы могли бы также сказать мне, есть ли лучший способ сделать это. Если вы ответите, пожалуйста, дайте мне точную информацию о том, как изменить код. Я пытался понять это с помощью нескольких разных книг, но я не могу понять, что я делаю неправильно.
Рене