Skip to content

Instantly share code, notes, and snippets.

@cjnevin
Last active November 29, 2017 01:07
Show Gist options
  • Save cjnevin/0a3ed7d9a17d0869cba18381c4605adb to your computer and use it in GitHub Desktop.
Save cjnevin/0a3ed7d9a17d0869cba18381c4605adb to your computer and use it in GitHub Desktop.
Convert RGB(A) hex string to UIColor
import UIKit
fileprivate extension Int {
var rgbaPercentage: CGFloat {
return CGFloat(self) / 255.0
}
}
enum UIColorInputError: Error {
case invalidInputColor
}
extension UIColor {
convenience init?(hex: String) {
let chars = hex.characters.map { String($0) }
let start = Int((chars.index(of: "#") ?? -1) + 1)
let channels: [CGFloat] = stride(from: start, to: chars.count - 1, by: 2)
.flatMap { Int(chars[$0] + chars[$0 + 1], radix: 16)?.rgbaPercentage }
self.init(channels: channels)
}
private convenience init?(channels: [CGFloat]) {
switch channels.count {
case 3, 4: self.init(
red: channels[0],
green: channels[1],
blue: channels[2],
alpha: channels.count == 4 ? channels[3] : 1.0)
default: return nil
}
}
func hexString(withAlpha hasAlpha: Bool = false) throws -> String {
var r: CGFloat = 0
var g: CGFloat = 0
var b: CGFloat = 0
var a: CGFloat = 0
getRed(&r, green: &g, blue: &b, alpha: &a)
guard r >= 0 && r <= 1 && g >= 0 && g <= 1 && b >= 0 && b <= 1 else {
throw UIColorInputError.invalidInputColor
}
func makeChannel(with percentage: CGFloat) -> Int {
return Int(percentage * 255)
}
guard hasAlpha else {
return String(format: "#%02X%02X%02X",
makeChannel(with: r),
makeChannel(with: g),
makeChannel(with: b))
}
return String(format: "#%02X%02X%02X%02X",
makeChannel(with: r),
makeChannel(with: g),
makeChannel(with: b),
makeChannel(with: a))
}
}
let rgbColorWithHash = UIColor(hex: "#0FF1CE")!
let rgbColorWithoutHash = UIColor(hex: "BADA55")!
let rgbaColorWithHash = UIColor(hex: "#CAFEBABE")!
let rgbaColorWithoutHash = UIColor(hex: "DEADBEEF")!
rgbColorWithHash.hexString() // 0FF1CE
rgbaColorWithoutHash.hexString(withAlpha: true) // DEADBEEF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment