Подтвердить что ты не робот

Как преобразовать шестнадцатеричную строку RGB в UIColor в objective-c?

У меня есть значения цвета, исходящие из данных url, это "# ff33cc". Как я могу преобразовать это значение в UIColor? Я пытаюсь использовать следующие строки кода. Я не получаю значение для baseColor1 правильно. Похоже, я должен снять этот фунт char. Есть ли другой способ сделать это?

NSScanner *scanner2 = [NSScanner scannerWithString:@"#ff33cc"];
int baseColor1;
[scanner2 scanHexInt:&baseColor1]; 
CGFloat red = (baseColor1 & 0xFF0000);
[UIColor colorWithRed:red ...
4b9b3361

Ответ 1

Вы близки, но colorWithRed:green:blue:alpha: ожидает значений от 0.0 до 1.0, поэтому вам нужно сдвинуть биты вправо и разделить на 255.0 F:

CGFloat red   = ((baseColor1 & 0xFF0000) >> 16) / 255.0f;
CGFloat green = ((baseColor1 & 0x00FF00) >>  8) / 255.0f;
CGFloat blue  =  (baseColor1 & 0x0000FF) / 255.0f;

EDIT. Также NSScanner scanHexInt пропустит минус 0x перед шестнадцатеричной строкой, но я не думаю, что он пропустит символ # перед вашей шестнадцатеричной строкой. Вы можете добавить эту строку, чтобы обработать это:

[scanner2 setCharactersToBeSkipped:[NSCharacterSet symbolCharacterSet]]; 

Ответ 2

Я добавил замену строки, поэтому он принимает шестую строку с или без #

Возможный полный код:

+ (UIColor *)colorWithHexString:(NSString *)stringToConvert
{
    NSString *noHashString = [stringToConvert stringByReplacingOccurrencesOfString:@"#" withString:@""]; // remove the #
    NSScanner *scanner = [NSScanner scannerWithString:noHashString];
    [scanner setCharactersToBeSkipped:[NSCharacterSet symbolCharacterSet]]; // remove + and $

    unsigned hex;
    if (![scanner scanHexInt:&hex]) return nil;
    int r = (hex >> 16) & 0xFF;
    int g = (hex >> 8) & 0xFF;
    int b = (hex) & 0xFF;

    return [UIColor colorWithRed:r / 255.0f green:g / 255.0f blue:b / 255.0f alpha:1.0f];
}

Ответ 3

Я создал функцию, которая работает в следующих случаях: 1) с или без # 2) и длинные значения 3 и 6 символов # 000, а также # 000000 3) В случае дополнительных цифр более шести он игнорирует дополнительные цифры

//Function Call
UIColor *organizationColor = [self colorWithHexString:@"#AAAAAAAAAAAAA" alpha:1];

//Function
- (UIColor *)colorWithHexString:(NSString *)str_HEX  alpha:(CGFloat)alpha_range{
    NSString *noHashString = [str_HEX stringByReplacingOccurrencesOfString:@"#" withString:@""]; // remove the #

    int red = 0;
    int green = 0;
    int blue = 0;

if ([str_HEX length]<=3)
    {
        sscanf([noHashString UTF8String], "%01X%01X%01X", &red, &green, &blue);
        return  [UIColor colorWithRed:red/16.0 green:green/16.0 blue:blue/16.0 alpha:alpha_range];
    }
else if ([str_HEX length]>7)
    {
        NSString *mySmallerString = [noHashString substringToIndex:6];
        sscanf([mySmallerString UTF8String], "%02X%02X%02X", &red, &green, &blue);
        return  [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:alpha_range];
    }
else
{
    sscanf([noHashString UTF8String], "%02X%02X%02X", &red, &green, &blue);
    return  [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:alpha_range];
}}