2010-06-09 12 views
13

I valori di colore provenienti dai dati dell'URL sono come "# ff33cc". Come posso convertire questo valore in UIColor? Sto tentando con le seguenti linee di codice. Non sto ottenendo il valore per baseColor1 a destra. Sembra che dovrei togliere quella libbra. C'è un altro modo per farlo?Come posso convertire la stringa esadecimale RGB in UIColor nell'obiettivo-c?

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

Secondo la documentazione, '- (BOOL) scanHexInt: (unsigned *) intValue', così si potrebbe desiderare di dichiarare' baseColor' come 'unsigned'; a parte questo, mi piace la risposta di progrmr. – Isaac

risposta

25

Sei vicino, ma si aspetta colorWithRed:green:blue:alpha: valori compresi tra 0,0 e 1,0, quindi è necessario spostare i bit a destra e dividere per 255.0f:

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

EDIT - Anche scanHexInt di NSScanner sarà saltare oltre 0x di fronte a una stringa esadecimale, ma non penso che salterà il carattere # davanti alla stringa esadecimale. È possibile aggiungere questa riga per gestire questo:

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

Bella soluzione intelligente ed elegante! Buon lavoro! – ninehundredt

12

ho aggiunto una sostituzione di stringa in modo che accetti una stringa esadecimale, con o senza l'#

Possibile codice 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

Questo è eccellente, grazie. Tuttavia, non impostando 'charactersToBeSkipped' sullo scanner si evita già la necessità della sostituzione della stringa' #'? – devios1

1

Ho eseguito una funzione che funziona nei seguenti casi: - 1) con o senza # 2) valori di 3 e 6 caratteri # 000 nonché # 000000 3) In caso di cifre aggiuntive più di sei ignora le cifre aggiuntive

//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]; 
}} 
Problemi correlati