2011-12-31 13 views
7

¿Hay una manera fácil de convertir UIColor a un valor hexadecimal?
¿O tenemos que obtener los componentes RGB con CGColorGetComponents y luego resolverlo desde allí?UIColor a hexadecimal (color web)

e.g CGColorGetComponents(color.CGColor)[0] * 256?

Respuesta

7

Considero utilizar la categoría UIColor de Erica Sadun. Incluye una gran cantidad de funcionalidades de forma gratuita, incluidas las representaciones hexadecimales. Es bastante fácil de usar, solo agrégalo al encabezado de clase en el que lo estés usando o agrégalo al encabezado precompilado para obtener la máxima flexibilidad. Si va a añadir a la cabecera precompilado, lo hacen similar a algo como esto:

#ifdef __OBJC__ 
    #import <Foundation/Foundation.h> 
    #import <UIKit/UIKit.h> 
    #import "UIColor-Expanded.h" 
#endif 

A continuación, puede utilizarlo como tal NSLog(@"%@", [myColor hexStringFromColor]);

GitHub enlace a la categoría UIColor: https://github.com/erica/uicolor-utilities

ArsTechnica artículo al respecto: http://arstechnica.com/apple/guides/2009/02/iphone-development-accessing-uicolor-components.ars

+0

gran biblioteca. gracias por esto. – fes

+0

No hay problema. ¡Espero que funcione para usted! – lewiguez

1

No existe, hasta donde yo sé, ninguna solución incorporada.
Sin embargo, tenga en cuenta que debe multiplicar por 255 en lugar de 256.

Obtener una representación hexadecimal es una tarea fácil, por lo que no tendrá muchos problemas para construir la cadena manualmente.

NSLog(@"%X%X%X", redInteger, greenInteger, blueInteger); 
+0

Creo que es una forma inteligente de hacerlo. Dado que el componente devuelve un número flotante, ¿cómo se puede convertir con precisión en un número entero? por ejemplo, para un color violáceo: UIDeviceRGBColorSpace 0.548638 0.554697 1 1 – fes

+0

tendrá números enteros al fundir o redondear el resultado, probó RGB 0.548638 0.554697 1, truncando, redondeando, dándome cada vez * el mismo * color violáceo. –

+0

¿Puede darme un ejemplo de su truncamiento y redondeo?Tal vez estoy redondeando demasiado alto pero siempre obtengo 1 y el% X% X% X sale como 111 – fes

9

También tuve que convertir un UIColor a sus componentes hex.

Como ya lo ha señalado lewiguez hay una muy buena categoría en github que hace todo eso.

Pero como quería aprender cómo se hace, hice mi propia implementación simple para colores RGB.

+ (NSString*)colorToWeb:(UIColor*)color 
{ 
    NSString *webColor = nil; 

    // This method only works for RGB colors 
    if (color && 
     CGColorGetNumberOfComponents(color.CGColor) == 4) 
    { 
     // Get the red, green and blue components 
     const CGFloat *components = CGColorGetComponents(color.CGColor); 

     // These components range from 0.0 till 1.0 and need to be converted to 0 till 255 
     CGFloat red, green, blue; 
     red = roundf(components[0] * 255.0); 
     green = roundf(components[1] * 255.0); 
     blue = roundf(components[2] * 255.0); 

     // Convert with %02x (use 02 to always get two chars) 
     webColor = [[NSString alloc]initWithFormat:@"%02x%02x%02x", (int)red, (int)green, (int)blue]; 
    } 

    return webColor; 
} 

¡Todos los comentarios son bienvenidos!

+0

Este método funciona perfectamente, ¡gracias! – BFeher

2

Aparte de la solución de cadena ampliamente utilizada, aquí hay una solución basada en hexadecimal (entero). Uso:

UIColor* color = lf_rgb(0x120aef); 
log(@"color %.6x", color.hex_rgb); 

Y obtendrá "color 120aef". Voy a poner estos códigos en https://github.com/superarts/LCategory, o puede copiar y pegar en su propio banco de código también:

#define lf_rgb(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] 

@interface UIColor (lc_rgb) 
- (NSInteger)hex_rgb; 
@end 

@implementation UIColor (lc_rgb) 
- (NSInteger)hex_rgb 
{ 
    CGFloat r, g, b, a; 
    BOOL result = [self getRed:&r green:&g blue:&b alpha:&a]; 
    // log(@"rgba: %f, %f, %f, %f", r * 255, g * 255, b * 255, a * 255); 
    if ((result == NO) || (a != 1.0f)) 
     return -1; 
    return 
     (NSInteger)(r * 255) * 256 * 256 + 
     (NSInteger)(g * 255) * 256 + 
     (NSInteger)(b * 255) * 1; 
} 
@end 
0

Así es como yo lo hice con Swift 3:

extension UIColor { 
    var hex:String{ 
     get{ 
      var red:CGFloat = 0 
      var blue:CGFloat = 0 
      var green:CGFloat = 0 
      var alpha:CGFloat = 0 

      self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) 
      let rgb:Int = (Int)(red*255)<<16 | (Int)(green*255)<<8 | (Int)(blue*255)<<0 
      return String.localizedStringWithFormat("#%06x", rgb) 
     } 
    } 
} 

O puede hacer que sea un método. Me gusta cómo se ve color.hex contra color.hex().

Cuestiones relacionadas