How to convert UIColor to HEX and display in NSLog How to convert UIColor to HEX and display in NSLog ios ios

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)];}