How to convert UIColor to HEX and display in NSLog
Swift 5:
func hexStringFromColor(color: UIColor) -> String { let components = color.cgColor.components let r: CGFloat = components?[0] ?? 0.0 let g: CGFloat = components?[1] ?? 0.0 let b: CGFloat = components?[2] ?? 0.0 let hexString = String.init(format: "#%02lX%02lX%02lX", lroundf(Float(r * 255)), lroundf(Float(g * 255)), lroundf(Float(b * 255))) print(hexString) return hexString }func colorWithHexString(hexString: String) -> UIColor { var colorString = hexString.trimmingCharacters(in: .whitespacesAndNewlines) colorString = colorString.replacingOccurrences(of: "#", with: "").uppercased() print(colorString) let alpha: CGFloat = 1.0 let red: CGFloat = self.colorComponentFrom(colorString: colorString, start: 0, length: 2) let green: CGFloat = self.colorComponentFrom(colorString: colorString, start: 2, length: 2) let blue: CGFloat = self.colorComponentFrom(colorString: colorString, start: 4, length: 2) let color = UIColor(red: red, green: green, blue: blue, alpha: alpha) return color}func colorComponentFrom(colorString: String, start: Int, length: Int) -> CGFloat { let startIndex = colorString.index(colorString.startIndex, offsetBy: start) let endIndex = colorString.index(startIndex, offsetBy: length) let subString = colorString[startIndex..<endIndex] let fullHexString = length == 2 ? subString : "\(subString)\(subString)" var hexComponent: UInt32 = 0 guard Scanner(string: String(fullHexString)).scanHexInt32(&hexComponent) else { return 0 } let hexFloat: CGFloat = CGFloat(hexComponent) let floatValue: CGFloat = CGFloat(hexFloat / 255.0) print(floatValue) return floatValue}
How to use
let red = CGFloat(30.0)let green = CGFloat(171.0)let blue = CGFloat(13.0)let alpha = CGFloat(1.0)let color = UIColor(red: CGFloat(red/255.0), green: CGFloat(green/255.0), blue: CGFloat(blue / 255.0), alpha: alpha)let colorCode = self.hexStringFromColor(color: color)print(colorCode)let resultColor = self.colorWithHexString(hexString: colorCode)print(resultColor)
Objective-C:
- (NSString *)hexStringFromColor:(UIColor *)color { const CGFloat *components = CGColorGetComponents(color.CGColor); CGFloat r = components[0]; CGFloat g = components[1]; CGFloat b = components[2]; return [NSString stringWithFormat:@"#%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255)];}
After getting hex code string, Call below method to get UIColor
- (UIColor *) colorWithHexString: (NSString *) hexString{ NSString *colorString = [[hexString stringByReplacingOccurrencesOfString: @"#" withString: @""] uppercaseString]; NSLog(@"colorString :%@",colorString); CGFloat alpha, red, blue, green; // #RGB alpha = 1.0f; red = [self colorComponentFrom: colorString start: 0 length: 2]; green = [self colorComponentFrom: colorString start: 2 length: 2]; blue = [self colorComponentFrom: colorString start: 4 length: 2]; return [UIColor colorWithRed: red green: green blue: blue alpha: alpha];}- (CGFloat) colorComponentFrom: (NSString *) string start: (NSUInteger) start length: (NSUInteger) length { NSString *substring = [string substringWithRange: NSMakeRange(start, length)]; NSString *fullHex = length == 2 ? substring : [NSString stringWithFormat: @"%@%@", substring, substring]; unsigned hexComponent; [[NSScanner scannerWithString: fullHex] scanHexInt: &hexComponent]; return hexComponent / 255.0;}
How to use
// ( R = 30, G = 171, B = 13)? CGFloat red = 30.0;CGFloat green = 171.0;CGFloat blue = 13.0; CGFloat alpha = 255.0UIColor *color = [UIColor colorWithRed:(red/255.0) green:(green/255.0) blue:(blue/255.0) alpha:(alpha/255.0)];NSString *colorCode = [self hexStringFromColor:color];NSLog(@"Color Code: %@", colorCode);UIColor *resultColor = [self colorWithHexString:colorCode];
And finally the version which works with alpha-component and uses right multiplier
extension UIColor { var hexString: String? { var red: CGFloat = 0 var green: CGFloat = 0 var blue: CGFloat = 0 var alpha: CGFloat = 0 let multiplier = CGFloat(255.999999) guard self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) else { return nil } if alpha == 1.0 { return String( format: "#%02lX%02lX%02lX", Int(red * multiplier), Int(green * multiplier), Int(blue * multiplier) ) } else { return String( format: "#%02lX%02lX%02lX%02lX", Int(red * multiplier), Int(green * multiplier), Int(blue * multiplier), Int(alpha * multiplier) ) } }}
Kampai's answer works for RGB colors, but not for monochrome (UIColor colorWithWhite:alpha:). It also doesn't handle alpha, which HEX supports. Here's a slightly modified version of hexStringFromColor:
+ (NSString *)hexStringFromColor:(UIColor *)color{ CGColorSpaceModel colorSpace = CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)); const CGFloat *components = CGColorGetComponents(color.CGColor); CGFloat r, g, b, a; if (colorSpace == kCGColorSpaceModelMonochrome) { r = components[0]; g = components[0]; b = components[0]; a = components[1]; } else if (colorSpace == kCGColorSpaceModelRGB) { r = components[0]; g = components[1]; b = components[2]; a = components[3]; } return [NSString stringWithFormat:@"#%02lX%02lX%02lX%02lX", lroundf(r * 255), lroundf(g * 255), lroundf(b * 255), lroundf(a * 255)];}