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

App*_*Guy 38 iphone objective-c uicolor ipad ios

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

其次,我在哪里输入RGB颜色编号(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)];

}
Run Code Online (Sandbox Code Playgroud)

我检查过的链接:

来自uicolor的十六进制颜色

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

我试图在viewDidLoad中调用该方法,但是如果没有UIColor它将无法工作.我确信这很简单.

感谢任何回答的人.

我在viewDidLoad中使用什么代码来调用此方法以便在NSLog中显示?

Kam*_*pai 56

使用以下代码:

- (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)];
}
Run Code Online (Sandbox Code Playgroud)

获取十六进制代码字符串后,调用以下方法获取 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];
}
Run Code Online (Sandbox Code Playgroud)

`

- (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;
}
Run Code Online (Sandbox Code Playgroud)

用法

// ( 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];
Run Code Online (Sandbox Code Playgroud)

  • 除非您确定要处理RGBA或HSVA颜色,否则此代码不安全.(HSVA会自动映射到RGBA.)但是尝试使用灰度颜色,并且您将访问内存超出范围.它还返回无效的alpha值.我强烈建议杰夫的回答如下. (2认同)

Jef*_*eff 23

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)];
}
Run Code Online (Sandbox Code Playgroud)


Val*_*gin 21

最后是使用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)
            )
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我很好奇为什么 255.999999 是正确的乘数,而不是(看似)广泛使用的 255。 (4认同)

m_k*_*kis 13

对于像白色这样的UIColors,其他Swift答案崩溃,其中CGColor只返回了2个组件.

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

例如:

白色将返回#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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • a(alpha)是从0到1的Float值,因此您可以执行以下操作:------- color + = String(format:“%02lX”,lroundf(Float(a * 255))) (2认同)

Isu*_*uru 9

extension UIColor {
    var hexString: String? {
        guard let components = self.cgColor.components else { return nil }

        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))
    }
}
Run Code Online (Sandbox Code Playgroud)


Joe*_*off 7

在Swift中,我只是创建了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)))
    }
}
Run Code Online (Sandbox Code Playgroud)


Art*_*nko 5

快捷方式:

extension UIColor {
    var hexString: String {
        cgColor.components![0..<3]
            .map { String(format: "%02lX", Int($0 * 255)) }
            .reduce("#", +)
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您需要带 alpha 的十六进制,只需[0..<3]从代码中删除。

另一个更安全的实现,它适用于一个组件颜色(如 UIColor.white、UIColor.black):

    var hexString: String {
        var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0
        getRed(&r, green: &g, blue: &b, alpha: nil)
        return [r, g, b].map { String(format: "%02lX", Int($0 * 255)) }.reduce("#", +)
    }
Run Code Online (Sandbox Code Playgroud)