Created
December 30, 2019 20:44
-
-
Save mcousillas6/77cfbdc03525029a8cd5a11b02d0147a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//: A UIKit based Playground for presenting user interface | |
import UIKit | |
import PlaygroundSupport | |
enum ColorSpace { | |
case rainbow | |
case gray | |
var colors: [CGColor] { | |
switch self { | |
case .rainbow: | |
return [UIColor.white.cgColor, UIColor.blue.cgColor, UIColor.red.cgColor, UIColor.purple.cgColor] | |
case .gray: | |
return [UIColor.white.cgColor, UIColor.gray.cgColor, UIColor.black.cgColor] | |
} | |
} | |
} | |
extension UIView { | |
func colorAt(point: CGPoint) -> UIColor { | |
let rgbMax: CGFloat = 255.0 | |
let colorSpace: CGColorSpace = CGColorSpaceCreateDeviceRGB() | |
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue) | |
var pixelData: [UInt8] = [0, 0, 0, 0] | |
guard let context = CGContext( | |
data: &pixelData, | |
width: 1, | |
height: 1, | |
bitsPerComponent: 8, | |
bytesPerRow: 4, | |
space: colorSpace, | |
bitmapInfo: bitmapInfo.rawValue | |
) else { | |
return UIColor.white | |
} | |
context.translateBy(x: -point.x, y: -point.y) | |
layer.render(in: context) | |
let red: CGFloat = CGFloat(pixelData[0]) / rgbMax | |
let green: CGFloat = CGFloat(pixelData[1]) / rgbMax | |
let blue: CGFloat = CGFloat(pixelData[2]) / rgbMax | |
let alpha: CGFloat = CGFloat(pixelData[3]) / rgbMax | |
return UIColor(red: red, green: green, blue: blue, alpha: alpha) | |
} | |
} | |
class ColorPickerView: UIView { | |
let gradient = CAGradientLayer() | |
let pickerIndicator = UIView() | |
var selectedColor = UIColor.black | |
convenience init() { | |
self.init(frame:.zero) | |
} | |
override init(frame: CGRect) { | |
super.init(frame: frame) | |
setup() | |
} | |
required init?(coder aDecoder: NSCoder) { | |
super.init(coder: aDecoder) | |
setup() | |
} | |
private func setup() { | |
pickerIndicator.backgroundColor = selectedColor | |
pickerIndicator.layer.borderColor = UIColor.white.cgColor | |
pickerIndicator.layer.borderWidth = 2 | |
addSubview(pickerIndicator) | |
} | |
override func layoutSubviews() { | |
super.layoutSubviews() | |
let indicatorSize = frame.width / 2 | |
pickerIndicator.frame.size = CGSize(width: indicatorSize, height: indicatorSize) | |
print(indicatorSize) | |
pickerIndicator.layer.cornerRadius = indicatorSize / 2 | |
gradient.frame = frame | |
bringSubviewToFront(pickerIndicator) | |
} | |
override func draw(_ rect: CGRect) { | |
super.draw(rect) | |
gradient.frame = rect | |
gradient.colors = ColorSpace.rainbow.colors | |
layer.addSublayer(gradient) | |
} | |
} | |
class MyViewController : UIViewController { | |
var picker: ColorPickerView? | |
override func loadView() { | |
let view = UIView() | |
view.backgroundColor = .white | |
self.view = view | |
} | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
let colorPicker = ColorPickerView() | |
colorPicker.translatesAutoresizingMaskIntoConstraints = false | |
view.addSubview(colorPicker) | |
NSLayoutConstraint.activate([ | |
colorPicker.leadingAnchor.constraint(equalTo: view.leadingAnchor), | |
colorPicker.trailingAnchor.constraint(equalTo: view.trailingAnchor), | |
colorPicker.topAnchor.constraint(equalTo: view.topAnchor), | |
colorPicker.bottomAnchor.constraint(equalTo: view.bottomAnchor) | |
]) | |
picker = colorPicker | |
} | |
override func viewDidAppear(_ animated: Bool) { | |
super.viewDidAppear(animated) | |
print(picker!.colorAt(point: CGPoint(x: 50, y: 150))) | |
} | |
} | |
// Present the view controller in the Live View window | |
PlaygroundPage.current.liveView = MyViewController() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment