13

我在将 uicolor 转换为十六进制颜色时遇到问题,这是我发现的

CGColorRef colorref = [[Colorview_ backgroundColor] CGColor];

int numComponents = CGColorGetNumberOfComponents(colorref);

if (numComponents == 4) {
    const CGFloat *components = CGColorGetComponents(colorref);

    int hexValue = 0xFF0000*components[0] + 0xFF00*components[1] + 0xFF*components[2];

    NSString *hexString = [NSString stringWithFormat:@"#%d", hexValue];
}

这段代码给了我#5576149(例如)hexString,我们你看到有7位数字而不是6位,它不是十六进制颜色,任何帮助将不胜感激,谢谢。

4

4 回答 4

13

上面的 sylphos 答案不适用于 darkGrayColor。

这效果更好(取自http://softteco.blogspot.jp/2011/06/extract-hex-rgb-color-from-uicolor.html):

- (NSString *) hexFromUIColor:(UIColor *)color {
    if (CGColorGetNumberOfComponents(color.CGColor) < 4) {
        const CGFloat *components = CGColorGetComponents(color.CGColor);
        color = [UIColor colorWithRed:components[0] green:components[0] blue:components[0] 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)];
}
于 2012-10-30T07:17:11.453 回答
2
NSString *hexString = [NSString stringWithFormat:@"#%d", hexValue];

您正在使用 %d 将其格式化为数字

您想使用 %x 或 %X 将其格式化为十六进制 - 也许作为字符串 %s 我没有检查函数正在做什么以及int hexValue正在保存什么

d 或 i 有符号十进制整数 392

x 无符号十六进制整数 7fa

X 无符号十六进制整数(大写字母) 7FA

于 2012-04-23T17:39:20.097 回答
2

我昨天尝试过,因为我必须从 uicolor 获取十六进制颜色并使其在 javascript 中也可以工作,但是当组件为 0 时这不起作用,因为它得到 0 而不是 00。所以纯青色会为 RGB 0 255 255,此代码将返回 #0ffff 而不是 #00ffff。

我用你的代码制作了这段代码,它正在我的应用程序上运行:

-(NSString*)colorToHex:(UIColor*)color{

    CGColorRef colorref = [color CGColor];

    const CGFloat *components = CGColorGetComponents(colorref);

    NSString *hexString = @"#";
    int hexValue = 0;

    for (int i=0; i<3; i++) {
        if (components[i] == 0) {
            hexString = [NSString stringWithFormat:@"%@00", hexString];
        }else{
            hexValue = 0xFF*components[i];
            hexString = [NSString stringWithFormat:@"%@%x", hexString, hexValue];
        }
    }

    return hexString;
}
于 2012-07-31T18:16:01.717 回答
1

这是它的一个版本,但被格式化为 C 函数:

static inline NSString *hexFromUIColor(UIColor * _color) {
    if (CGColorGetNumberOfComponents(_color.CGColor) < 4) {
        const CGFloat *components = CGColorGetComponents(_color.CGColor);
        _color = [UIColor colorWithRed:components[0] green:components[0] blue:components[0] 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)];
}
于 2013-08-14T21:15:13.910 回答