Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert UIColor to HEX and display in NSLog

I have checked several links on how to convert UIColor codes to HEX however I am not sure on how to call to the method to display them in NSLog. I haven't got the reputation to comment so posting as a question is my last resort. I want it to display when I run my app in the log.

Second, where do I input the RGB color number ( R = 30, G = 171, B = 13)? I see that all examples use Array [0], [1], [2] which normally refers to index position, so where do I add the color values?

I have this code:

- (NSString *) hexFromUIColor:(UIColor *)color {      if (CGColorGetNumberOfComponents(color.CGColor) < 4) {         const CGFloat *components = CGColorGetComponents(color.CGColor);         color = [UIColor colorWithRed:components[30] green:components[141] blue:components[13] alpha:components[1]];     }     if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) != kCGColorSpaceModelRGB) {         return [NSString stringWithFormat:@"#FFFFFF"];     }     return [NSString stringWithFormat:@"#%02X%02X%02X", (int)((CGColorGetComponents(color.CGColor))[0]*255.0), (int)((CGColorGetComponents(color.CGColor))[1]*255.0), (int)((CGColorGetComponents(color.CGColor))[2]*255.0)];  } 

Links I have checked:

hex color from uicolor

How to convert HEX RGB color codes to UIColor?

I have tried to call the method in viewDidLoad however it wont work without UIColor. I am sure it's something simple.

Thanks to anyone who answers.

What is the code I use in my viewDidLoad to call to this method in order to display in NSLog?

like image 943
App Dev Guy Avatar asked Oct 13 '14 13:10

App Dev Guy


People also ask

How do you convert Heicolor to hex?

To convert a UIColor instance to a hex value, we define a convenience method, toHex(alpha:) . The method accepts one parameter of type Bool , which indicates whether the alpha value should be included in the string that is returned from the method.

How do I change the hex color in Swiftui?

To make this work, you have to add two extensions to your codebase. The first one allows you to specify a hex color from an Int , which you can conveniently specify in hexadecimal form. This is also quite a bit quicker to execute than the string version, if perfomance is of any concern to you.

What is CGColor in Swift?

CGColor is the fundamental data type used internally by Core Graphics to represent colors. CGColor objects, and the functions that operate on them, provide a fast and convenient way of managing and setting colors directly, especially colors that are reused (such as black for text).


2 Answers

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.0 UIColor *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]; 
like image 130
Kampai Avatar answered Oct 03 '22 11:10

Kampai


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)             )         }     } } 
like image 39
Valentin Shergin Avatar answered Oct 03 '22 13:10

Valentin Shergin