Шестигранный цвет от uicolor

У меня проблема с преобразованием uicolor в hex-цвет, вот что я нашел

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, это не шестнадцатеричный цвет, любая помощь будет оценена, спасибо.

Ответ 1

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

Вы форматируете его как цифру с% d

Вы хотите отформатировать его как шестнадцатеричный с% x или% X - возможно, как строка% s. Я не проверял, что делает функция, и что int hexValue держит

d или я Подписанное десятичное целое число 392

x Неподписанное шестнадцатеричное целое число 7fa

X Неподписанное шестнадцатеричное целое число (заглавные буквы) 7FA

Ответ 2

Ответ 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)];
}

Ответ 3

Я попробовал это вчера, потому что мне нужно было получить шестнадцатеричный цвет от 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;
}

Ответ 4

Вот версия этого, но отформатированная как функция 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)];
}