2010-09-27 29 views
64

Tengo un código hexadecimal RGB como #ffffff como NSString y quiero convertirlo en un UIColor. ¿Hay una manera simple de hacer eso?Cómo convertir códigos de color HEX RGB a UIColor?

+0

Si no quiere hacer esto con el código que puede echar un vistazo a [http://uicolor.io/] (http://uicolor.io/). Convierte fácilmente HEX y RGB a UIColor para Swift y Objective-C además hay un selector de color por si acaso ... – manosim

+2

Solo una actualización: la URL de 'http: // uicolor.io /' ha cambiado [http://uicolor.xyz](http://uicolor.xyz) – manosim

Respuesta

102

In some code of mine, utilizo 2 funciones diferentes:

void SKScanHexColor(NSString * hexString, float * red, float * green, float * blue, float * alpha) { 
    NSString *cleanString = [hexString stringByReplacingOccurrencesOfString:@"#" withString:@""]; 
    if([cleanString length] == 3) { 
     cleanString = [NSString stringWithFormat:@"%@%@%@%@%@%@", 
        [cleanString substringWithRange:NSMakeRange(0, 1)],[cleanString substringWithRange:NSMakeRange(0, 1)], 
        [cleanString substringWithRange:NSMakeRange(1, 1)],[cleanString substringWithRange:NSMakeRange(1, 1)], 
        [cleanString substringWithRange:NSMakeRange(2, 1)],[cleanString substringWithRange:NSMakeRange(2, 1)]]; 
    } 
    if([cleanString length] == 6) { 
     cleanString = [cleanString stringByAppendingString:@"ff"]; 
    } 

    unsigned int baseValue; 
    [[NSScanner scannerWithString:cleanString] scanHexInt:&baseValue]; 

    if (red) { *red = ((baseValue >> 24) & 0xFF)/255.0f; } 
    if (green) { *green = ((baseValue >> 16) & 0xFF)/255.0f; } 
    if (blue) { *blue = ((baseValue >> 8) & 0xFF)/255.0f; } 
    if (alpha) { *alpha = ((baseValue >> 0) & 0xFF)/255.0f; } 
} 

Y luego lo uso así:

UIColor * SKColorFromHexString(NSString * hexString) { 
    float red, green, blue, alpha; 
    SKScanHexColor(hexString, &red, &green, &blue, &alpha); 

    return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; 
} 

Si prefiere utilizar esto como una categoría UIColor, entonces es sólo una cuestión de alterar unas pocas líneas:

+ (UIColor *) colorFromHexString:(NSString *)hexString { 
    NSString *cleanString = [hexString stringByReplacingOccurrencesOfString:@"#" withString:@""]; 
    if([cleanString length] == 3) { 
     cleanString = [NSString stringWithFormat:@"%@%@%@%@%@%@", 
        [cleanString substringWithRange:NSMakeRange(0, 1)],[cleanString substringWithRange:NSMakeRange(0, 1)], 
        [cleanString substringWithRange:NSMakeRange(1, 1)],[cleanString substringWithRange:NSMakeRange(1, 1)], 
        [cleanString substringWithRange:NSMakeRange(2, 1)],[cleanString substringWithRange:NSMakeRange(2, 1)]]; 
    } 
    if([cleanString length] == 6) { 
     cleanString = [cleanString stringByAppendingString:@"ff"]; 
    } 

    unsigned int baseValue; 
    [[NSScanner scannerWithString:cleanString] scanHexInt:&baseValue]; 

    float red = ((baseValue >> 24) & 0xFF)/255.0f; 
    float green = ((baseValue >> 16) & 0xFF)/255.0f; 
    float blue = ((baseValue >> 8) & 0xFF)/255.0f; 
    float alpha = ((baseValue >> 0) & 0xFF)/255.0f; 

    return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; 
} 

Este se encargará de cadenas como "#abc", "# abcdef31", etc. .

+0

se ve bien! ¡gracias hombre! – openfrog

+2

Entiendo todo hasta: '((baseValue >> 24) & 0xFF)'. (Obtengo la división por 255.0f). ¿Podrías explicar cómo llegas a cambiar 24, 16 y 8 bits? Y también, ¿por qué estás y estás con 0xFF? Gracias :) –

+0

línea sobre "En algún código mío" no funciona – ArunaFromLK

4

Creo que dividiría los seis caracteres en tres pares, luego los convertiría en decimales y luego los dividiría en 255 para obtener cada componente de color como un flotador.

A continuación, puede pasar a los componentes:

[UIColor colorWithRed: green: blue: alpha:1]; 
85

Si está utilizando valores Hex ..

#define UIColorFromRGB(rgbValue) [UIColor \ 
     colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \ 
     green:((float)((rgbValue & 0xFF00) >> 8))/255.0 \ 
     blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] 

    //Then use any Hex value 

self.view.backgroundColor = UIColorFromRGB(0xD2691E); 
+2

Buen compañero de trabajo. – ardochhigh

+0

¡Ojalá Apple agregara esto a sus archivos de encabezado! no hay razón por la que no! – ishahak

3

Si no desea escribir todo esto código anterior, se puede comprobar en este sitio: http://www.diovo.com/apps/rgb-to-uicolor-converter.html
de un color HEX así: #FFFFFF, el sitio de convertirlo en una cadena como esta:

UIColor *aColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1.000];

+0

aww enlace muerto :-( –

+0

enlace alternativo: http://scratch.johnnypez.com/hex-to-uicolor/ – rog

20

Hay una bonita categoría para UIColor llama "UIColor+Expanded" que tiene un método de clase para conseguir un UIColor de una cadena RGB hexadecimal:

Es muy sencillo de utilizar:

UIColor *myColor = [UIColor colorWithHexString:@"FF0000"]; 

además de que añade un montón de otras materias potencialmente utilidades útiles para UIColor. Más información está disponible en this article.

+0

No muestra ningún problema pero no funciona, importé UIColor + Expanded.h y UIColor + Expanded.m. Aquí está la línea. Self.navigationController.navigationBar.tintColor = [UIColor colorWithHexString: @ "# 555555"]; – Souljacker

+1

@ Ravin455 Probablemente necesite sacar ese símbolo # (como se muestra en mi respuesta original). –

+0

+1 Esto será muy útil gracias –

2

no se olvide que usted tiene la opción de convert your hex values to RGB e introducirlas en el constructor de interfaces. Guardará algunas líneas de código.

rgb sliders

+0

http://colorpicker.com/ es el mejor en comparación con su enlace –

35

que estaba buscando una solución sencilla y se acercó con esto (no completamente Objective-C, pero funciona de maravilla):

NSString *stringColor = @"#AABBCC"; 
NSUInteger red, green, blue; 
sscanf([stringColor UTF8String], "#%02X%02X%02X", &red, &green, &blue); 

UIColor *color = [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:1]; 
+1

Gracias por publicar esto, ¡funciona excelente para mí! Ojalá pudiera darte +10 votos. – rog

+0

¡Solución muy elegante! +1 –

6

La manera más fácil que he encontrado: Hex to UIColor Converter

Simplemente escriba el número hexadecimal sin '#', y devuelve el código UIColor. Por ejemplo, el código para el color naranja (# f77f00) es:

[UIColor colorWithRed:0.969 green:0.498 blue:0 alpha:1.0] 
+0

nice one ehsan..simple super herramienta para obtener hexadecimal uicolor .. – RockandRoll

+1

Enlace muerto. Esto todavía funciona: http://www.corecoding.com/utilities/rgb-or-hex-to-float.php – mm2001

2

supongo que esto es un poco tarde aquí ...pero me encontré con esta versión en el repositorio WhiteHouse Github que lo hace de una manera muy elegante:

+(UIColor *)colorFromRGBHexString:(NSString *)colorString { 
    if(colorString.length == 7) { 
     const char *colorUTF8String = [colorString UTF8String]; 
     int r, g, b; 
     sscanf(colorUTF8String, "#%2x%2x%2x", &r, &g, &b); 
     return [UIColor colorWithRed:(r/255.0) green:(g/255.0) blue:(b/255.0) alpha:1.0]; 
    }  
    return nil; 
} 

Source Link to their WHAppConfig.m on github

8
+ (UIColor *)colorWithHexString:(NSString *)colorString 
{ 
    colorString = [colorString stringByReplacingOccurrencesOfString:@"#" withString:@""]; 

    if (colorString.length == 3) 
     colorString = [NSString stringWithFormat:@"%c%c%c%c%c%c", 
     [colorString characterAtIndex:0], [colorString characterAtIndex:0], 
     [colorString characterAtIndex:1], [colorString characterAtIndex:1], 
     [colorString characterAtIndex:2], [colorString characterAtIndex:2]]; 

    if (colorString.length == 6) 
    { 
     int r, g, b; 
     sscanf([colorString UTF8String], "%2x%2x%2x", &r, &g, &b); 
     return [UIColor colorWithRed:(r/255.0) green:(g/255.0) blue:(b/255.0) alpha:1.0]; 
    } 
    return nil; 
} 

para el formato # 123, 123, # fff195, fff195

+ (UIColor *)colorWithHexValue:(int)hexValue 
{ 
    float red = ((hexValue & 0xFF0000) >> 16)/255.0; 
    float green = ((hexValue & 0xFF00) >> 8)/255.0; 
    float blue = (hexValue & 0xFF)/255.0; 
    return [UIColor colorWithRed:red green:green blue:blue alpha:1.0]; 
} 

para el formato 0xfff195

0

Terminé creando una categoría para UIColor que puedo reutilizar en mis otros proyectos. Github: https://github.com/mattquiros/UIColorHexColor

El uso va como:

UIColor *customRedColor = [UIColor colorFromHex:0x990000]; 

Esto es mucho más rápido que la transmisión de una cadena y la conversión a un número a continuación, desplazar los bits. También puede importar la categoría desde el interior de su archivo .pch para que pueda utilizar fácilmente colorFromHex todas partes en su aplicación como que está integrado en UIColor:

#ifdef __OBJC__ 
    #import <UIKit/UIKit.h> 
    #import <Foundation/Foundation.h> 
    // Your other stuff here... 
    #import "UIColor+HexColor.h" 
#endif 
0

Creo que hay una manera aún más fácil cuando se utilizan los valores HEX. Simplemente agregue una definición en la parte superior de su archivo o haga referencia a un archivo de encabezado para la conversión (UIColorFromRGB). Incluso puede agregar una plantilla de valores de color HEX fijos.

#define CLR_YELLOW_TEXT  0xf4dc89 // A Light Yellow text 
#define CLR_GREEN_TEXT  0x008040 // Dark Green text for my buttons 

#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] 

A continuación, sólo hacen referencia a él en su código utilizando los valores HEX directamente o sus valores hexadecimales definidos. Por ejemplo ...

[myButton1 setTitleColor:UIColorFromRGB(0xd02d2d) forState:UIControlStateNormal]; 
[myButton2 setTitleColor:UIColorFromRGB(CLR_GREEN_TEXT) forState:UIControlStateNormal]; 
[myButton3 setTitleColor:UIColorFromRGB(CLR_YELLOW_TEXT) forState:UIControlStateNormal]; 

(PS - Esto supone un alfa de 1,0, pero siempre se puede cambiar en la definición).

Disfrútalo.

2

creé una herramienta en línea para convertir instantáneamente cualquier código hexadecimal a un fragmento de código UIColor de Swift y ObjectiveC, para cuando es incómodo de usar métodos o plugins personalizados: http://ebelinski.com/uihex/

1

Si la conversión de ObjectiveC a Swift es difícil para ti, esta es la respuesta con Swift. Actualmente solo toma cadenas sin el #, pero puede agregar un método de escaneo para omitirlo, creo.

func stringToColor(stringColor: String) -> UIColor { 
    var hexInt: UInt32 = 0 
    let scanner = NSScanner(string: stringColor) 
    scanner.scanHexInt(&hexInt) 
    let color = UIColor(
     red: CGFloat((hexInt & 0xFF0000) >> 16)/225, 
     green: CGFloat((hexInt & 0xFF00) >> 8)/225, 
     blue: CGFloat((hexInt & 0xFF))/225, 
     alpha: 1) 

    return color 
} 
0

Encontré una biblioteca de cocoapod muy útil en la creación de UIColor usando los valores "#RRGGBB".

pod 'UIColor-HexRGB' 
0
+(UIColor*)colorWithHexString:(NSString*)hexString 

{

NSString *cString = [[hexString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString]; 

if ([cString length] < 6) return [UIColor grayColor]; 

if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2]; 

if ([cString length] != 6) return [UIColor grayColor]; 

NSRange range; 
range.location = 0; 
range.length = 2; 
NSString *rString = [cString substringWithRange:range]; 

range.location = 2; 
NSString *gString = [cString substringWithRange:range]; 

range.location = 4; 
NSString *bString = [cString substringWithRange:range]; 

unsigned int r, g, b; 
[[NSScanner scannerWithString:rString] scanHexInt:&r]; 
[[NSScanner scannerWithString:gString] scanHexInt:&g]; 
[[NSScanner scannerWithString:bString] scanHexInt:&b]; 

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

}