web-dev-qa-db-fra.com

Comment convertir des codes de couleur HEX RVB en UIColor?

J'ai un code hexadécimal RVB comme #ffffff en tant que NSString et je veux le convertir en UIColor. Y a-t-il un moyen simple de faire ça?

65
openfrog

Dans certains de mes codes , j'utilise 2 fonctions différentes:

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

Et puis je l'utilise comme ça:

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 vous préférez utiliser ceci comme une catégorie UIColor, il suffit alors de modifier quelques lignes:

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

Cela gérera des chaînes comme "#abc", "# abcdef31", etc.

102
Dave DeLong

Si vous utilisez des valeurs hexadécimales .. 

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

Je cherchais une solution simple et suis venu avec ceci (pas complètement Objective-C, mais fonctionne à merveille):

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

Il existe une catégorie Nice pour UIColor appelée "UIColor + Expanded" qui dispose d'une méthode de classe pour obtenir un UIColor à partir d'une chaîne hexagonale RVB:

C'est simple à utiliser:

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

De plus, il ajoute de nombreux autres utilitaires potentiellement utiles à UIColor. Plus d'informations sont disponibles dans cet article .

20
Jim Rhoades

Facile, il suffit d’aller sur ce site et de saisir votre valeur hexadécimale: http://www.corecoding.com/utilities/rgb-or-hex-to-float.php

11
MikeTheCoder
+ (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;
}

pour les formats # 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];
}

pour le format 0xfff195

8
ChikabuZ

Le moyen le plus simple que j'ai trouvé: Hex to UIColor Converter

Il suffit de taper le nombre hexadécimal sans '#', et il renvoie le code UIColor. Par exemple, le code de la couleur orange (# f77f00) est le suivant:

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

Je pense que je scindais les six caractères en trois paires, que je convertissais ensuite en nombre décimal, puis que je divisais le chiffre par 255 pour obtenir chaque composante de couleur sous forme de valeur flottante.

Vous pouvez ensuite passer les composants à:

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

Si vous ne voulez pas écrire tout le code ci-dessus, vous pouvez consulter ce site: http://www.diovo.com/apps/rgb-to-uicolor-converter.html
D'une couleur HEX comme celle-ci: #FFFFFF, le site le convertit en chaîne telle que:

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

3
matteodv

J'ai créé un outil en ligne pour convertir instantanément n'importe quel code hexadécimal en extrait de code UIColor pour Swift et Objective-C, lorsqu'il est difficile d'utiliser des méthodes personnalisées ou des plugins: http://ebelinski.com/uihex/

3
Eugene

N'oubliez pas que vous avez la possibilité de convertir vos valeurs hexadécimales en RVB et les saisir dans le générateur d'interface. Cela économisera quelques lignes de code.

rgb sliders

2
Kyle Clegg

Si la conversion d’ObjectiveC en Swift est difficile, voici la réponse avec Swift. Actuellement, il ne faut que des chaînes sans le #, mais vous pouvez ajouter une méthode de balayage pour le sauter, je crois.

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
}
2
Tom Prats

Je suppose que c'est un peu tard ici ... mais j'ai trouvé cette version dans le dépôt WhiteHouse Github qui le fait d'une manière assez élégante:

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

Lien source vers leur WHAppConfig.m sur github

2
Jonathon Hibbard

J'ai fini par créer une catégorie pour UIColor que je peux simplement réutiliser dans mes autres projets. Github: https://github.com/mattquiros/UIColorHexColor

L'usage va comme:

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

C'est beaucoup plus rapide que de passer une chaîne et de la convertir en nombre puis de décaler les bits. Vous pouvez également importer la catégorie depuis votre fichier .pch afin de pouvoir facilement utiliser colorFromHex partout dans votre application, comme s'il était intégré à UIColor:

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

J'ai trouvé une bibliothèque cocoapod très utile pour créer UIColor avec les valeurs "#RRGGBB".

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

}

0
Kemo

Je pense qu’il existe un moyen encore plus simple d’utiliser des valeurs HEX ..__: ajoutez simplement une définition en haut de votre fichier ou faites référence à un fichier d’en-tête pour la conversion (UIColorFromRGB). Vous pouvez même ajouter un modèle de valeurs de couleur HEX fixes. 

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

Il suffit ensuite de le référencer dans votre code en utilisant directement les valeurs HEX ou vos valeurs hexadécimales définies . Par exemple ...

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

(PS - Cela suppose un alpha de 1,0, mais cela peut toujours être modifié dans la définition).

Prendre plaisir.

0
Blaine L