Skip to content

Instantly share code, notes, and snippets.

@mcousillas6
Created December 30, 2019 20:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mcousillas6/77cfbdc03525029a8cd5a11b02d0147a to your computer and use it in GitHub Desktop.
Save mcousillas6/77cfbdc03525029a8cd5a11b02d0147a to your computer and use it in GitHub Desktop.
//: 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