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?
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.
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.
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).
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)
- (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];
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) ) } } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With