diff --git a/README.md b/README.md index a699163..d42fb0c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![No Maintenance Intended](http://unmaintained.tech/badge.svg)](http://unmaintained.tech/) + # SwiftHSVColorPicker ## Description @@ -36,4 +38,4 @@ SwiftHSVColorPicker is available under the MIT license. See the LICENSE file for ## Author Johan Kasperi
[@johankasperi](http://twitter.com/johankasperi)
-[kspri.se](http://kspri.se) \ No newline at end of file +[kspri.se](http://kspri.se) diff --git a/Source/ColorUtils.swift b/Source/ColorUtils.swift index e4c7a42..6d46a9b 100644 --- a/Source/ColorUtils.swift +++ b/Source/ColorUtils.swift @@ -86,3 +86,32 @@ func rgb2hsv(_ rgb: RGB) -> HSV { hsb.alpha = rgb.alpha return hsb } + +public extension UIColor { + + var sRGBColor: UIColor { + if #available(iOS 10.0, *) { + // Only iOS 10.0 and above requires conversion from other color space to sRGB. + // On earlier versions of iOS, the specified values of red, green and blue are always between 0.0 and 1.0. + var sRGBColor: CGColor? = nil + if let colorSpaceName = cgColor.colorSpace?.name { + let compareResult = CFStringCompare(colorSpaceName, CGColorSpace.sRGB, CFStringCompareFlags(rawValue: 0)) + if compareResult != .compareEqualTo, let sRGBSpace = CGColorSpace(name: CGColorSpace.sRGB), + let sRGBConvertedColor = cgColor.converted(to: sRGBSpace, intent: .defaultIntent, options: nil) { + sRGBColor = sRGBConvertedColor + } else { + sRGBColor = cgColor + } + } + + if let sRGBColor = sRGBColor { + let color = UIColor(cgColor: sRGBColor) + return color + } + return self + } else { + // Fallback on earlier versions. + return self + } + } +} diff --git a/Source/ColorWheel.swift b/Source/ColorWheel.swift index c6cff6a..00766bf 100755 --- a/Source/ColorWheel.swift +++ b/Source/ColorWheel.swift @@ -202,7 +202,7 @@ class ColorWheel: UIView { if (d == 0) { hue = 0; } else { - hue = acos(dx/d) / CGFloat(M_PI) / 2.0 + hue = acos(dx/d) / CGFloat.pi / 2.0 if (dy < 0) { hue = 1.0 - hue } @@ -215,8 +215,8 @@ class ColorWheel: UIView { let dimension: CGFloat = min(wheelLayer.frame.width, wheelLayer.frame.height) let radius: CGFloat = saturation * dimension / 2 - let x = dimension / 2 + radius * cos(hue * CGFloat(M_PI) * 2) + 20; - let y = dimension / 2 + radius * sin(hue * CGFloat(M_PI) * 2) + 20; + let x = dimension / 2 + radius * cos(hue * CGFloat.pi * 2) + 20; + let y = dimension / 2 + radius * sin(hue * CGFloat.pi * 2) + 20; return CGPoint(x: x, y: y) } diff --git a/Source/SwiftHSVColorPicker.swift b/Source/SwiftHSVColorPicker.swift index f856e65..6a0ac28 100755 --- a/Source/SwiftHSVColorPicker.swift +++ b/Source/SwiftHSVColorPicker.swift @@ -7,11 +7,17 @@ import UIKit +public protocol SwiftHSVColorPickerDelegate: class { + func colorPicker(_ picker: SwiftHSVColorPicker, didChangeColor color: UIColor) +} + open class SwiftHSVColorPicker: UIView, ColorWheelDelegate, BrightnessViewDelegate { var colorWheel: ColorWheel! var brightnessView: BrightnessView! var selectedColorView: SelectedColorView! + open weak var delegate: SwiftHSVColorPickerDelegate? + open var color: UIColor! var hue: CGFloat = 1.0 var saturation: CGFloat = 1.0 @@ -36,41 +42,52 @@ open class SwiftHSVColorPicker: UIView, ColorWheelDelegate, BrightnessViewDelega self.saturation = saturation self.brightness = brightness self.color = color - setup() + setupIfNeeded() + + delegate?.colorPicker(self, didChangeColor: self.color) } - func setup() { - // Remove all subviews - let views = self.subviews - for view in views { - view.removeFromSuperview() + func setupIfNeeded() { + if colorWheel != nil && brightnessView != nil && selectedColorView != nil { + colorWheel.setViewBrightness(brightness) + brightnessView.setViewColor(color) + selectedColorView.setViewColor(color) + } else { + // Remove all subviews + let views = self.subviews + for view in views { + view.removeFromSuperview() + } + + let selectedColorViewHeight: CGFloat = 44.0 + let brightnessViewHeight: CGFloat = 26.0 + + // let color wheel get the maximum size that is not overflow from the frame for both width and height + let colorWheelSize = min(self.bounds.width, self.bounds.height - selectedColorViewHeight - brightnessViewHeight) + + // let the all the subviews stay in the middle of universe horizontally + let centeredX = (self.bounds.width - colorWheelSize) / 2.0 + + // Init SelectedColorView subview + selectedColorView = SelectedColorView(frame: CGRect(x: centeredX, y:0, width: colorWheelSize, height: selectedColorViewHeight), color: self.color) + selectedColorView.layer.cornerRadius = 5.0 + selectedColorView.layer.borderWidth = 1.0 + selectedColorView.layer.borderColor = UIColor.darkGray.cgColor + // Add selectedColorView as a subview of this view + self.addSubview(selectedColorView) + + // Init new ColorWheel subview + colorWheel = ColorWheel(frame: CGRect(x: centeredX, y: selectedColorView.frame.maxY, width: colorWheelSize, height: colorWheelSize), color: self.color) + colorWheel.delegate = self + // Add colorWheel as a subview of this view + self.addSubview(colorWheel) + + // Init new BrightnessView subview + brightnessView = BrightnessView(frame: CGRect(x: centeredX, y: colorWheel.frame.maxY, width: colorWheelSize, height: brightnessViewHeight), color: self.color) + brightnessView.delegate = self + // Add brightnessView as a subview of this view + self.addSubview(brightnessView) } - - let selectedColorViewHeight: CGFloat = 44.0 - let brightnessViewHeight: CGFloat = 26.0 - - // let color wheel get the maximum size that is not overflow from the frame for both width and height - let colorWheelSize = min(self.bounds.width, self.bounds.height - selectedColorViewHeight - brightnessViewHeight) - - // let the all the subviews stay in the middle of universe horizontally - let centeredX = (self.bounds.width - colorWheelSize) / 2.0 - - // Init SelectedColorView subview - selectedColorView = SelectedColorView(frame: CGRect(x: centeredX, y:0, width: colorWheelSize, height: selectedColorViewHeight), color: self.color) - // Add selectedColorView as a subview of this view - self.addSubview(selectedColorView) - - // Init new ColorWheel subview - colorWheel = ColorWheel(frame: CGRect(x: centeredX, y: selectedColorView.frame.maxY, width: colorWheelSize, height: colorWheelSize), color: self.color) - colorWheel.delegate = self - // Add colorWheel as a subview of this view - self.addSubview(colorWheel) - - // Init new BrightnessView subview - brightnessView = BrightnessView(frame: CGRect(x: centeredX, y: colorWheel.frame.maxY, width: colorWheelSize, height: brightnessViewHeight), color: self.color) - brightnessView.delegate = self - // Add brightnessView as a subview of this view - self.addSubview(brightnessView) } func hueAndSaturationSelected(_ hue: CGFloat, saturation: CGFloat) { @@ -79,6 +96,8 @@ open class SwiftHSVColorPicker: UIView, ColorWheelDelegate, BrightnessViewDelega self.color = UIColor(hue: self.hue, saturation: self.saturation, brightness: self.brightness, alpha: 1.0) brightnessView.setViewColor(self.color) selectedColorView.setViewColor(self.color) + + delegate?.colorPicker(self, didChangeColor: self.color) } func brightnessSelected(_ brightness: CGFloat) { @@ -86,5 +105,7 @@ open class SwiftHSVColorPicker: UIView, ColorWheelDelegate, BrightnessViewDelega self.color = UIColor(hue: self.hue, saturation: self.saturation, brightness: self.brightness, alpha: 1.0) colorWheel.setViewBrightness(brightness) selectedColorView.setViewColor(self.color) + + delegate?.colorPicker(self, didChangeColor: self.color) } } diff --git a/SwiftHSVColorPicker.podspec b/SwiftHSVColorPicker.podspec index a46288a..b4a2e8f 100644 --- a/SwiftHSVColorPicker.podspec +++ b/SwiftHSVColorPicker.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'SwiftHSVColorPicker' - s.version = '1.1.0' + s.version = '1.1.3' s.summary = 'Swift HSV Color Picker' s.description = 'A HSV Color Picker for iOS including a color wheel, brightness slider and a view for the selected color.' s.homepage = 'https://github.com/johankasperi/SwiftHSVColorPicker' diff --git a/SwiftHSVColorPickerExample/ViewController.swift b/SwiftHSVColorPickerExample/ViewController.swift index 9e047f3..10b7b1a 100644 --- a/SwiftHSVColorPickerExample/ViewController.swift +++ b/SwiftHSVColorPickerExample/ViewController.swift @@ -21,6 +21,7 @@ class ViewController: UIViewController { // Do any additional setup after loading the view, typically from a nib. // Setup Color Picker + colorPicker.delegate = self colorPicker.setViewColor(selectedColor) } @@ -40,3 +41,9 @@ class ViewController: UIViewController { print(selectedColor!) } } + +extension ViewController: SwiftHSVColorPickerDelegate { + func colorPicker(_ picker: SwiftHSVColorPicker, didChangeColor color: UIColor) { + print("did change color to: \(color), sRGB equivalent: \(color.sRGBColor)") + } +}