Pregunta

Tengo un código hexadecimal RGB como #ffffff como nsstring y quiero convertirlo en un uicolor. ¿Hay alguna forma simple de hacer eso?

¿Fue útil?

Solución

En algún código mío, Uso 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 usar esto como un UIColor Categoría, entonces es solo una cuestión de alterar algunas 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];
}

Esto manejará cadenas como "#ABC", "#ABCDEF31", etc.

Otros consejos

Si estás usando valores hexadecimales.

#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);   

Estaba buscando una solución simple y se le ocurrió esto (no completamente objetivo-C, pero funciona como un encanto):

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];

Hay una buena categoría para Uicolor llamado "Uicolor+expandido" que tiene un método de clase para obtener un Uicolor de una cadena HEX RGB:

Es simple de usar:

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

Además, agrega muchas otras utilidades potencialmente útiles a Uicolor. Más información está disponible en Este artículo.

Fácil, solo vaya a este sitio web y escriba su valor hexadecimal: http://www.corecoding.com/utilidades/rgb-or-hex-to-float.php

+ (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 formato 0xfff195

La forma más fácil que encontré: Hex para el convertidor Uicolor

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]

Creo que dividiría los seis caracteres en tres pares, luego lo convertiría en decimal, luego dividiría eso por 255 para obtener cada componente de color como flotante.

Luego puede pasar los componentes a:

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

Creé una herramienta en línea para convertir instantáneamente cualquier código hexadecimal a un fragmento de código de uicolor para Swift y Objective-C, para cuando es inconveniente usar métodos o complementos personalizados: https://iosref.com/uihex/

Si no desea escribir todo este código anterior, puede consultar este sitio: http://www.diovo.com/apps/rgb-to-uicolor-converter.html
De un color hexadecimal como este: #FFFFFF, el sitio lo convierte en una cadena como esta:

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

Si convertir de Objectivec a Swift es difícil para usted, aquí está la respuesta con Swift. Actualmente solo toma cadenas sin el #, pero creo que puede agregar un método de escáner para omitirlo.

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)/255,
        green: CGFloat((hexInt & 0xFF00) >> 8)/255,
        blue: CGFloat((hexInt & 0xFF))/255,
        alpha: 1)

    return color
}

No olvides que tienes la opción de Convierta sus valores hexadecimales a RGB e ingresarlos en el constructor de interfaz. Guardará algunas líneas de código.

rgb sliders

Supongo que esto es un poco tarde aquí ... pero encontré esta versión en el repositorio de Whitehouse GitHub que lo hace de una manera bastante 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;
}

Enlace de origen a su whappconfig.m en github

Creo que hay una manera aún más fácil cuando se usa valores hexadecimales. 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 hexadecimales 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]

Luego, simplemente haga referencia en su código utilizando los valores hexadecimales directamente o sus valores hexagonales 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).

Disfrutar.

Encontré una biblioteca de Cocoapod muy útil para crear uicolor utilizando valores "#RRGGBB".

pod 'UIColor-HexRGB'
+(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];

}

Terminé creando una categoría para UIColor que puedo reutilizar en mis otros proyectos.

C objetivo

#import <UIKit/UIKit.h>

@interface UIColor (HexColor)

+ (UIColor *)colorFromHex:(unsigned long)hex;

@end

@implementation UIColor (HexColor)

+ (UIColor *)colorFromHex:(unsigned long)hex
{
  return [UIColor colorWithRed:((float)((hex & 0xFF0000) >> 16))/255.0 green:((float)((hex & 0xFF00) >> 8))/255.0 blue:((float)(hex & 0xFF))/255.0 alpha:1.0];
}

@end

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

Rápido

extension UIColor {

  convenience init(hex: Int) {
    let red = CGFloat((hex & 0xff0000) >> 16) / 255.0
    let green = CGFloat((hex & 0x00ff00) >> 8) / 255.0
    let blue = CGFloat(hex & 0x0000ff) / 255.0
    self.init(red: red, green: green, blue: blue, alpha: 1.0)
  }

}

// USAGE
let customColor = UIColor(hex: 0x990000)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top