wake-up-neo.net

Wie konvertiert man UIColor in HEX und zeigt es in NSLog an?

Ich habe einige Links zum Konvertieren von UIColor-Codes in HEX geprüft. Ich bin jedoch nicht sicher, wie ich die Methode aufrufen soll, um sie in NSLog anzuzeigen. Ich habe nicht den Ruf, einen Kommentar abzugeben, daher ist das Posten als Frage mein letzter Ausweg. Ich möchte, dass es angezeigt wird, wenn ich meine App im Protokoll ausführe.

Zweitens, wo gebe ich die RGB-Farbnummer ein (R = 30, G = 171, B = 13)? Ich sehe, dass alle Beispiele Array [0], [1], [2] verwenden, das sich normalerweise auf die Indexposition bezieht. Wo füge ich dann die Farbwerte hinzu?

Ich habe diesen 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)];

}

Links, die ich überprüft habe:

hex Farbe von uicolor

Wie konvertiere ich HEX RGB-Farbcodes in UIColor?

Ich habe versucht, die Methode in viewDidLoad aufzurufen, funktioniert jedoch nicht ohne UIColor. Ich bin sicher, dass es etwas Einfaches ist. 

Danke an alle, die antworten.

Welchen Code verwende ich in viewDidLoad, um diese Methode aufzurufen, um in NSLog angezeigt zu werden?

31
App Dev Guy

Verwenden Sie den folgenden Code:

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

Nachdem Sie den Hex-Code-String abgerufen haben, rufen Sie die Methode under auf, um UIColor zu erhalten

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

VERWENDUNGSZWECK

// ( 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

Kampais Antwort funktioniert für RGB-Farben, nicht jedoch für Monochrom (UIColor colorWithWhite: alpha :). Es kann auch nicht mit Alpha umgehen, was HEX unterstützt. Hier ist eine leicht modifizierte Version von 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

Und schließlich die Version, die mit alpha- Komponente arbeitet und den richtigen Multiplikator verwendet

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

Andere Swift-Antworten stürzen ab für UIColors wie Weiß, wo nur zwei Komponenten von CGColor zurückgegeben werden.

Hier ist eine Swift 4 -Version, die dieses Problem nicht hat und außerdem Transparenzinformationen am Ende des Strings zurückgibt, falls dies erforderlich ist (Webformat).

Zum Beispiel: 

Weiß wird zurückgegeben #FFFFFF

Weiß mit 50% Deckkraft wird zurückgegeben # 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

In Swift habe ich einfach eine Erweiterung für UIColor erstellt ... 

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 der akzeptierten Antwort. Ich habe in eine UIColor-Erweiterung konvertiert.

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

Die Antwort von Swift 2 wurde in Swift 3 umgewandelt

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

Dies ist die richtige Reihenfolge, wenn Sie die Farben für Android benötigen. Das Alpha geht vor:

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(alpha * multiplier),
                Int(red * multiplier),
                Int(green * multiplier),
                Int(blue * multiplier)
            )
        }
    }
}

Dann rufen Sie an als:

debugPrint("testColor > ", self.testColor().hexString!)
1
MrG

Mögliche Falle beim Umgang mit Alpha: HEX-Strings gibt es in verschiedenen Formaten, einige haben ihr Alpha am Anfang des Hex-Strings und andere Formate haben es am Ende. Abhängig von Ihrem Hintergrund können Sie eine andere Vorstellung davon haben, wie die Hex-Zeichenfolge formatiert wird. Für Android-Entwickler dürfte es am Anfang das Alpha sein, für Webentwickler am Ende der Zeichenfolge. SO STAATEN SIE IMMER DAS FORMAT DES HEX-STRINGS, um Verwirrung zu vermeiden. Android-Hex-Zeichenfolgen müssen das Alpha am Anfang haben. Das ist also eine Falle, in die die Leute geraten können, wenn es um Hex-Strings geht (ich habe es getan), und es ist daher wichtig zu sagen, welches Format erwartet wird. Also, wenn Sie eine App für iOS und Android entwickeln, was für diese Falle.

Links: https://en.wikipedia.org/wiki/RGBA_color_space für Details, warum eine HEX-Zeichenfolge auf unterschiedliche Weise formatiert werden kann, in einigen Fällen mit dem Alpha am Anfang. Android-Links https://developer.Android.com/reference/Android/graphics/Color.html und https://Gist.github.com/lopspower/03fb1cc0ac9f32ef38f4

BITTE BEACHTEN SIE FÜR #AARRGGBB Hex-String-Format Verwenden Sie den folgenden Code, damit das Alpha am Anfang des Strings steht.

(Hinweis: Wenn color == null schwarz zurückgegeben wird).

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