试图让拾色器在 Swift 2.0 中工作
trying to get Color Picker to work in Swift 2.0
我真的很难让颜色选择器工作。在我无法让它将任何信息委托回呼叫后,我尝试了以下操作:
为 UIViewController
命名的 UIViewController VCColorPicker.swift
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 接收到一种颜色,该颜色被写入放置在 VCColorPicker 上的标签 "LabelColor" 的 BackgroundColor 中。
不幸的是,出现了两个问题:首先,window 没有在我尝试填充 LabelColor 的最后一行构建。 (应用程序未构建)如果我将其取出,VCColorPicker 的屏幕将不会加载,并给出以下错误代码。
2016-02-17 22:47:27.798 MagicACC[13202:2720420] 未知 class Interface Builder 文件中的 HSBColorPicker。
已加载 VCColorPicker
2016-02-17 22:47:27.806 MagicACC[13202:2720420] * 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'* -CGColor 未定义UI颜色;需要先转换色彩空间。'
这是我在页面上找到并尝试改编的 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
}
}
如果有人能告诉我我需要如何更改实际有效的代码,我将不胜感激。先感谢您。也许你也可以告诉我是否有更好的方法来做到这一点。如果您回答,请给我有关如何更改代码的确切信息。我试图用几本不同的书来理解它,但我不知道我做错了什么。
勒内
好的。在逐行完成所有操作后,我终于明白了。该错误与代码没有任何关系,但实际上与我实施的工作流程有关。该程序试图匹配一个尚未被赋予任何值的变量。 :-) 所以说真的,如果有人提出相同的错误代码,只要看看您是否错过了同样的问题。 :-)
我真的很难让颜色选择器工作。在我无法让它将任何信息委托回呼叫后,我尝试了以下操作:
为 UIViewController
命名的 UIViewController VCColorPicker.swiftUIView 已连接到 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 接收到一种颜色,该颜色被写入放置在 VCColorPicker 上的标签 "LabelColor" 的 BackgroundColor 中。
不幸的是,出现了两个问题:首先,window 没有在我尝试填充 LabelColor 的最后一行构建。 (应用程序未构建)如果我将其取出,VCColorPicker 的屏幕将不会加载,并给出以下错误代码。
2016-02-17 22:47:27.798 MagicACC[13202:2720420] 未知 class Interface Builder 文件中的 HSBColorPicker。 已加载 VCColorPicker 2016-02-17 22:47:27.806 MagicACC[13202:2720420] * 由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'* -CGColor 未定义UI颜色;需要先转换色彩空间。'
这是我在页面上找到并尝试改编的 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
}
}
如果有人能告诉我我需要如何更改实际有效的代码,我将不胜感激。先感谢您。也许你也可以告诉我是否有更好的方法来做到这一点。如果您回答,请给我有关如何更改代码的确切信息。我试图用几本不同的书来理解它,但我不知道我做错了什么。
勒内
好的。在逐行完成所有操作后,我终于明白了。该错误与代码没有任何关系,但实际上与我实施的工作流程有关。该程序试图匹配一个尚未被赋予任何值的变量。 :-) 所以说真的,如果有人提出相同的错误代码,只要看看您是否错过了同样的问题。 :-)