diff --git a/Colours.m b/Colours.m index 2b500ea..2aa19bc 100755 --- a/Colours.m +++ b/Colours.m @@ -46,12 +46,32 @@ @implementation NSColor (Colours) #pragma mark - Color from Hex + (instancetype)colorFromHexString:(NSString *)hexString { - unsigned rgbValue = 0; + unsigned long long rgbValue = 0; + int base = 0; + int mask = 0; + hexString = [hexString stringByReplacingOccurrencesOfString:@"#" withString:@""]; NSScanner *scanner = [NSScanner scannerWithString:hexString]; - [scanner scanHexInt:&rgbValue]; - - return [[self class] colorWithR:((rgbValue & 0xFF0000) >> 16) G:((rgbValue & 0xFF00) >> 8) B:(rgbValue & 0xFF) A:1.0]; + [scanner scanHexLongLong:&rgbValue]; + + switch (hexString.length) { + case 3: + base = 8; + mask = 0xF; + break; + case 6: + base = 16; + mask = 0xFF; + break; + default: + return nil; + } + + CGFloat r = (CGFloat)(mask & (rgbValue >> base)) / (CGFloat)mask; + CGFloat g = (CGFloat)(mask & (rgbValue >> (base / 2))) / (CGFloat)mask; + CGFloat b = (CGFloat)(mask & (rgbValue >> 0)) / (CGFloat)mask; + + return [[self class] colorWithRed:r green:g blue:b alpha:1.0]; } diff --git a/Colours.swift b/Colours.swift index daa63fe..6b6512c 100644 --- a/Colours.swift +++ b/Colours.swift @@ -40,12 +40,26 @@ public extension Color { // MARK: - Color from Hex/RGBA/HSBA/CIE_LAB/CMYK convenience init(hex: String) { var rgbInt: UInt64 = 0 + var base: UInt64 = 0 + var mask: UInt64 = 0 + let newHex = hex.stringByReplacingOccurrencesOfString("#", withString: "") let scanner = NSScanner(string: newHex) scanner.scanHexLongLong(&rgbInt) - let r: CGFloat = CGFloat((rgbInt & 0xFF0000) >> 16)/255.0 - let g: CGFloat = CGFloat((rgbInt & 0x00FF00) >> 8)/255.0 - let b: CGFloat = CGFloat(rgbInt & 0x0000FF)/255.0 + + switch (newHex.characters.count) { + case 3: + base = 8 + mask = 0xF + default: + base = 16 + mask = 0xFF + } + + let r = CGFloat(mask & (rgbInt >> base)) / CGFloat(mask); + let g = CGFloat(mask & (rgbInt >> (base / 2))) / CGFloat(mask); + let b = CGFloat(mask & (rgbInt >> 0)) / CGFloat(mask); + self.init(red: r, green: g, blue: b, alpha: 1.0) }