web-dev-qa-db-fra.com

Comment convertir UIColor en HEX et l'afficher dans NSLog

J'ai vérifié plusieurs liens sur la façon de convertir les codes UIColor en HEX, mais je ne suis pas sûr de savoir comment appeler la méthode pour les afficher dans NSLog. Je n'ai pas la réputation de commenter, donc poster sous forme de question est mon dernier recours. Je souhaite qu'il s'affiche lorsque j'exécute mon application dans le journal.

Deuxièmement, où dois-je entrer le numéro de couleur RVB (R = 30, G = 171, B = 13)? Je vois que tous les exemples utilisent Array [0], [1], [2], qui fait normalement référence à la position d'index. Où dois-je donc ajouter les valeurs de couleur?

J'ai ce code:

- (NSString *) hexFromUIColor:(UIColor *)color {

    if (CGColorGetNumberOfComponents(color.CGColor) < 4) {
        const CGFloat *components = CGColorGetComponents(color.CGColor);
        color = [UIColor colorWithRed:components[30] green:components[141] blue:components[13] alpha:components[1]];
    }
    if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) != kCGColorSpaceModelRGB) {
        return [NSString stringWithFormat:@"#FFFFFF"];
    }
    return [NSString stringWithFormat:@"#%02X%02X%02X", (int)((CGColorGetComponents(color.CGColor))[0]*255.0), (int)((CGColorGetComponents(color.CGColor))[1]*255.0), (int)((CGColorGetComponents(color.CGColor))[2]*255.0)];

}

Liens que j'ai vérifiés:

couleur hex de uicolor

Comment convertir des codes de couleur HEX RGB en UIColor?

J'ai essayé d'appeler la méthode dans viewDidLoad mais cela ne fonctionnera pas sans UIColor. Je suis sûr que c'est quelque chose de simple. 

Merci à tous ceux qui répondent.

Quel est le code que j'utilise dans viewDidLoad pour appeler cette méthode afin de l'afficher dans NSLog?

31
App Dev Guy

Utilisez le code ci-dessous:

- (NSString *)hexStringFromColor:(UIColor *)color {
    const CGFloat *components = CGColorGetComponents(color.CGColor);

    CGFloat r = components[0];
    CGFloat g = components[1];
    CGFloat b = components[2];

    return [NSString stringWithFormat:@"#%02lX%02lX%02lX",
            lroundf(r * 255),
            lroundf(g * 255),
            lroundf(b * 255)];
}

Après avoir obtenu la chaîne de code hexadécimal, appelez la méthode ci-dessous pour obtenir UIColor

- (UIColor *) colorWithHexString: (NSString *) hexString
{
    NSString *colorString = [[hexString stringByReplacingOccurrencesOfString: @"#" withString: @""] uppercaseString];

    NSLog(@"colorString :%@",colorString);
    CGFloat alpha, red, blue, green;

    // #RGB
    alpha = 1.0f;
    red   = [self colorComponentFrom: colorString start: 0 length: 2];
    green = [self colorComponentFrom: colorString start: 2 length: 2];
    blue  = [self colorComponentFrom: colorString start: 4 length: 2];

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

`

- (CGFloat) colorComponentFrom: (NSString *) string start: (NSUInteger) start length: (NSUInteger) length {
    NSString *substring = [string substringWithRange: NSMakeRange(start, length)];
    NSString *fullHex = length == 2 ? substring : [NSString stringWithFormat: @"%@%@", substring, substring];
    unsigned hexComponent;
    [[NSScanner scannerWithString: fullHex] scanHexInt: &hexComponent];
    return hexComponent / 255.0;
}

USAGE

// ( R = 30, G = 171, B = 13)? 
CGFloat red = 30.0;
CGFloat green = 171.0;
CGFloat blue = 13.0; 
CGFloat alpha = 255.0
UIColor *color = [UIColor colorWithRed:(red/255.0) green:(green/255.0) blue:(blue/255.0) alpha:(alpha/255.0)];
NSString *colorCode = [self hexStringFromColor:color];
NSLog(@"Color Code: %@", colorCode);

UIColor *resultColor = [self colorWithHexString:colorCode];
47
Kampai

La réponse de Kampai fonctionne pour les couleurs RVB, mais pas pour les couleurs monochromes (UIColor colorWithWhite: alpha :). Il ne gère pas non plus l'alpha, ce que HEX prend en charge. Voici une version légèrement modifiée de hexStringFromColor:

+ (NSString *)hexStringFromColor:(UIColor *)color
{
    CGColorSpaceModel colorSpace = CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor));
    const CGFloat *components = CGColorGetComponents(color.CGColor);

    CGFloat r, g, b, a;

    if (colorSpace == kCGColorSpaceModelMonochrome) {
        r = components[0];
        g = components[0];
        b = components[0];
        a = components[1];
    }
    else if (colorSpace == kCGColorSpaceModelRGB) {
        r = components[0];
        g = components[1];
        b = components[2];
        a = components[3];
    }

    return [NSString stringWithFormat:@"#%02lX%02lX%02lX%02lX",
            lroundf(r * 255),
            lroundf(g * 255),
            lroundf(b * 255),
            lroundf(a * 255)];
}
21
Jeff

Et enfin la version qui fonctionne avec le composantalpha- et utilise le multiplicateur de droite

extension UIColor {
    var hexString: String? {
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0

        let multiplier = CGFloat(255.999999)

        guard self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) else {
            return nil
        }

        if alpha == 1.0 {
            return String(
                format: "#%02lX%02lX%02lX",
                Int(red * multiplier),
                Int(green * multiplier),
                Int(blue * multiplier)
            )
        }
        else {
            return String(
                format: "#%02lX%02lX%02lX%02lX",
                Int(red * multiplier),
                Int(green * multiplier),
                Int(blue * multiplier),
                Int(alpha * multiplier)
            )
        }
    }
}
16
Valentin Shergin

Autres réponses rapides Swift pour UIColors comme blanc, où CGColor n'a retourné que 2 composants.

Voici une version Swift 4 qui ne présente pas ce problème et renvoie également des informations de transparence à la fin de la chaîne si nécessaire (format Web).

Par exemple: 

Blanc reviendra #FFFFFF

Blanc avec 50% d'opacité reviendra # FFFFFF7F

extension UIColor {
    var hexString: String {
        let colorRef = cgColor.components
        let r = colorRef?[0] ?? 0
        let g = colorRef?[1] ?? 0
        let b = ((colorRef?.count ?? 0) > 2 ? colorRef?[2] : g) ?? 0
        let a = cgColor.alpha

        var color = String(
            format: "#%02lX%02lX%02lX",
            lroundf(Float(r * 255)),
            lroundf(Float(g * 255)),
            lroundf(Float(b * 255))
        )

        if a < 1 {
            color += String(format: "%02lX", lroundf(Float(a)))
        }

        return color
    }
}
7
m_katsifarakis

Dans Swift, j'ai simplement créé une extension à UIColor ... 

extension UIColor
{

    var hexString:NSString {
        let colorRef = CGColorGetComponents(self.CGColor)

        let r:CGFloat = colorRef[0]
        let g:CGFloat = colorRef[1]
        let b:CGFloat = colorRef[2]

        return NSString(format: "#%02lX%02lX%02lX", lroundf(Float(r * 255)), lroundf(Float(g * 255)), lroundf(Float(b * 255)))
    }
}
6
Joel Kopelioff

Swift 2 version de la réponse acceptée. Je me suis converti en une extension UIColor.

extension UIColor {
    var hexString: String {
        let components = CGColorGetComponents(self.CGColor)

        let red = Float(components[0])
        let green = Float(components[1])
        let blue = Float(components[2])
        return String(format: "#%02lX%02lX%02lX", lroundf(red * 255), lroundf(green * 255), lroundf(blue * 255))
    }
}
3
Isuru

La réponse de Swift 2 convertie en Swift 3

var hexString: String {
    let components = self.cgColor.components

    let red = Float((components?[0])!)
    let green = Float((components?[1])!)
    let blue = Float((components?[2])!)
    return String(format: "#%02lX%02lX%02lX", lroundf(red * 255), lroundf(green * 255), lroundf(blue * 255))
}
2
Haris

Piège potentiel lors de l'utilisation d'alpha: les chaînes HEX sont disponibles dans différents formats. Certaines ont leur alpha au début de la chaîne et d'autres formats l'ont à la fin. Selon votre arrière-plan, vous aurez peut-être une idée différente de la façon dont la chaîne hexadécimale est formatée. Pour les développeurs Android, ce sera probablement avec l'alpha au début, pour les développeurs Web, ce sera probablement à la fin de la chaîne. SO INSCRIVEZ TOUJOURS LE FORMAT DE LA CHAÎNE HEX pour éviter toute confusion. Les chaînes hexadécimales Android doivent avoir l'alpha au début. C'est donc un piège dans lequel les gens peuvent tomber quand il s'agit de chaînes hexagonales (je l'ai fait) et il est donc important de dire quel est le format attendu. Donc, si vous développez une application à la fois pour iOS et Android, ce qui se passe pour ce piège.

Liens: https://en.wikipedia.org/wiki/RGBA_color_space pour plus de détails sur les raisons pour lesquelles une chaîne HEX peut être formatée de différentes manières, dans certains cas avec l'alpha au début. Liens Android https://developer.Android.com/reference/Android/graphics/Color.html et https://Gist.github.com/lopspower/03fb1cc0ac9f32ef38f4

VEUILLEZ NOTER POUR #AARRGGBB Format de chaîne hexadécimale Utilisez le code suivant pour que l’alpha soit au début de la chaîne.

(Remarque: si color == null, le noir est renvoyé).

+(NSString*)hexStringFromColor:(UIColor *)color
{

    CGFloat r = 0, g = 0, b = 0, a = 1;

    if (color) {
        [color getRed:&r green:&g blue:&b alpha:&a];
    }

    return [NSString stringWithFormat:@"#%02lX%02lX%02lX%02lX",
            lroundf(a * 255.0),
            lroundf(r * 255.0),
            lroundf(g * 255.0),
            lroundf(b * 255.0)
            ];

}
1
Grant Luck