如何将UIColor转换为HEX并在NSLog中显示

我已经检查了如何将UIColor代码转换为HEX的几个链接,但我不知道如何调用该方法在NSLog中显示它们。 我没有得到评论的声誉,所以张贴问题是我最后的手段。 我希望它在日志中运行我的应用程序时显示。

其次,我在哪里inputRGB颜色编号(R = 30,G = 171,B = 13)? 我看到所有的例子都使用Array [0],[1],[2]这通常是指索引位置,所以我在哪里添加颜色值?

我有这个代码:

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

我查过的链接:

从uicolorhex颜色

如何将HEX RGB颜色代码转换为UIColor?

我试图调用viewDidLoad中的方法,但它不会工作没有UIColor。 我相信这很简单。

感谢任何回答的人。

什么是我在我的viewDidLoad调用这个方法,以显示在NSLog中的代码?

使用下面的代码:

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

得到hex代码string后,调用下面的方法得到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; } 

用法

 // ( 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]; 

Kampai的答案适用于RGB颜色,但不适用于单色(UIColor colorWithWhite:alpha :)。 它也不处理HEX支持的alpha。 这是一个稍微修改的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)]; } 

最后是与alpha- component一起使用的版本,并使用正确的乘数

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

在Swift中,我只是创build了一个扩展到UIColor …

 extension UIColor { var hexString:NSString { let colorRef = CGColorGetComponents(self.CGColor) let r:CGFloat = colorRef[0] let g:CGFloat = colorRef[1] let b:CGFloat = colorRef[2] return NSString(format: "#%02lX%02lX%02lX", lroundf(Float(r * 255)), lroundf(Float(g * 255)), lroundf(Float(b * 255))) } } 

Swift 2版本的接受答案。 我转换成UIColor扩展名。

 extension UIColor { var hexString: String { let components = CGColorGetComponents(self.CGColor) let red = Float(components[0]) let green = Float(components[1]) let blue = Float(components[2]) return String(format: "#%02lX%02lX%02lX", lroundf(red * 255), lroundf(green * 255), lroundf(blue * 255)) } } 

迅速2答案转换为迅速3

 var hexString: String { let components = self.cgColor.components let red = Float((components?[0])!) let green = Float((components?[1])!) let blue = Float((components?[2])!) return String(format: "#%02lX%02lX%02lX", lroundf(red * 255), lroundf(green * 255), lroundf(blue * 255)) } 

处理Alpha时的潜在陷阱 :HEXstring有不同的格式,有些string在hexstring的开头,其他格式在最后。 根据您的背景,您可能对如何格式化hexstring有不同的看法。 对于Android开发人员来说,开始时可能会使用alpha,对于Web开发人员来说,它可能会在string的末尾。 为了避免混淆,总是使用HEX STRING的格式 。 Androidhexstring需要在开始时使用alpha。 所以这是一个人们可能会陷入到hexstring(我做过)的陷阱,因此很重要的是说预期的格式是什么。 所以,如果你正在为iOS和Android开发一个应用程序,那么这个陷阱是什么。

链接: https : //en.wikipedia.org/wiki/RGBA_color_space关于为什么一个hexstring可能以不同的方式格式化的细节,在一些情况下与阿尔法在开始。 Android链接https://developer.android.com/reference/android/graphics/Color.html和https://gist.github.com/lopspower/03fb1cc0ac9f32ef38f4

请注意#AARRGGBBhexstring格式使用下面的代码,以便Alpha在string的开头。

(注意:如果color == null black返回)。

 +(NSString*)hexStringFromColor:(UIColor *)color { CGFloat r = 0, g = 0, b = 0, a = 1; if (color) { [color getRed:&r green:&g blue:&b alpha:&a]; } return [NSString stringWithFormat:@"#%02lX%02lX%02lX%02lX", lroundf(a * 255.0), lroundf(r * 255.0), lroundf(g * 255.0), lroundf(b * 255.0) ]; } 

其他Swift答案像白色的UIColors 崩溃 ,CGColor只返回2个组件。

这是一个没有这个问题的Swift 4版本,如果需要的话(web格式),还会返回string末尾的透明信息。

例如:

白色将返回#FFFFFF

白色与50%不透明度将返回#FFFFFF7F

 extension UIColor { var hexString: String { let colorRef = cgColor.components let r = colorRef?[0] ?? 0 let g = colorRef?[1] ?? 0 let b = ((colorRef?.count ?? 0) > 2 ? colorRef?[2] : g) ?? 0 let a = cgColor.alpha var color = String( format: "#%02lX%02lX%02lX", lroundf(Float(r * 255)), lroundf(Float(g * 255)), lroundf(Float(b * 255)) ) if a < 1 { color += String(format: "%02lX", lroundf(Float(a))) } return color } }