Comment convertir UIColor en HEX et 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 sur la façon d'appeler à la méthode pour les afficher dans NSLog. Je n'ai pas la réputation de commentaire, donc l'affectation en question est mon dernier recours. je veux qu'il affiche quand je lance mon application dans le journal.

Deuxièmement, Où dois-je entrer le numéro de couleur RGB ( R = 30, G = 171, B = 13)? Je vois que tous les exemples utilisent le tableau [0], [1], [2] qui se réfère normalement à position de l'index, alors Où dois-je 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 cochés:

hexadécimal de la couleur de uicolor

comment convertir les codes de couleur HEX RGB en UIColor?

j'ai essayé d'appeler la méthode en viewDidLoad mais elle ne fonctionne 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 ma viewDidLoad pour appeler cette méthode afin de l'afficher dans NSLog?

30
demandé sur Community 2014-10-13 17:21:24

8 réponses

utiliser 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 codes hexadécimaux, appeler 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];
46
répondu Kampai 2014-10-13 13:43:15

Kampai la réponse de travaux pour les couleurs RVB, mais pas pour monochrome (UIColor colorWithWhite:alpha:). Il ne gère pas non plus alpha, que HEX supporte. 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)];
}
20
répondu Jeff 2015-02-26 22:03:38

et enfin la version qui fonctionne avec alpha - composant et utilise le multiplicateur droit

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)
            )
        }
    }
}
14
répondu Valentin Shergin 2016-09-07 05:45:24

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
répondu Joel Kopelioff 2015-06-21 17:02:30

autres réponses SWIFT crash pour UIColors comme white, où il n'y a que 2 composants retournés par CGColor.

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

par exemple:

Blanc retournera #fffff

blanc avec une opacité de 50% retournera #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
    }
}
5
répondu m_katsifarakis 2017-11-17 18:42:50

version Swift 2 de la réponse acceptée. J'ai 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
répondu Isuru 2016-02-01 13:07:03

la réponse 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
répondu Haris 2017-06-08 23:43:02

piège potentiel Lorsqu'il S'agit D'Alpha : les chaînes hexadécimales sont disponibles dans différents formats, certains ont leur alpha au début de la chaîne hexadécimale et d'autres formats l'ont à la fin. Selon votre contexte, vous pouvez avoir une idée différente de la façon dont la chaîne de caractères hexadécimaux est formatée. Pour les développeurs Android, il sera probablement avec l'alpha au début, pour les développeurs Web, il sera probablement à la fin de la chaîne. DONC TOUJOURS INDIQUER LE FORMAT DE LA CHAÎNE HEXADÉCIMALE pour éviter toute confusion. Les chaînes HEX Android sont nécessaires pour avoir l'alpha au début. Donc c'est un piège dans lequel les gens peuvent tomber quand il s'agit de chaînes hexadécimales (Je l'ai fait) et est donc important de dire ce qu'est le format attendu. Donc, si vous développez une application pour iOS et Android ce 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 hexagonale peut être formatée de différentes façons, 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

PLEASE NOTE FOR #AARRGGBB Hex string format Utilisez le code suivant si l'Alpha est au début de la chaîne.

(Note: si color == null noir est retourné).

+(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
répondu Grant Luck 2017-10-24 06:15:16