2010-06-09 13 views
13

Tengo valores de color provenientes de los datos de la url que son así, "# ff33cc". ¿Cómo puedo convertir este valor en UIColor? Estoy intentando con las siguientes líneas de código. No estoy obteniendo el valor correcto para baseColor1. Parece que debería quitarme esa libra de carbón. ¿Hay alguna otra forma de hacerlo?¿Cómo puedo convertir una cadena hexadecimal RGB en UIColor en Object-C?

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

de acuerdo con los documentos, '- (BOOL) scanHexInt: (sin signo *) intValue', así que sería bueno para declarar' 'baseColor' como unsigned'; Aparte de eso, me gusta la respuesta del progrmr. – Isaac

Respuesta

25

Estás cerca, pero colorWithRed:green:blue:alpha: espera valores que van de 0,0 a 1,0, por lo que necesita para cambiar los bits de la derecha y dividir por 255.0f:

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

EDITAR - También scanHexInt de NSScanner se salta más allá de 0x delante de una cadena hexagonal, pero no creo que omita el carácter # delante de tu cadena hexagonal. Puede añadir esta línea a manejar eso:

[scanner2 setCharactersToBeSkipped:[NSCharacterSet symbolCharacterSet]]; 
+0

¡Una solución ingeniosa y elegante! ¡Buen trabajo! – ninehundredt

12

añadí un reemplazo cadena para que acepte una cadena hexadecimal con o sin la #

Posible código completo:

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

Esto es excelente, gracias. Sin embargo, ¿el hecho de no configurar 'charactersToBeSkipped' en el escáner ya evita la necesidad del reemplazo de cadena' # '? – devios1

1

He hecho una función que funciona en los siguientes casos: - 1) con o sin # 2) valores de 3 y 6 caracteres de largo # 000 así como # 000000 3) En caso de dígitos adicionales más de seis ignora los dígitos adicionales

//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]; 
}} 
Cuestiones relacionadas