Wie kann ich eine UIColor aus einer Hex-Zeichenfolge erstellen?

Antworten:

722

Ich habe den einfachsten Weg gefunden, dies mit einem Makro zu tun. Fügen Sie es einfach in Ihren Header ein und es ist im gesamten Projekt verfügbar.

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

Farbiges Makro mit Hex-Werten

Auch formatierte Version dieses Codes:

#define UIColorFromRGB(rgbValue) \
[UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \
                green:((float)((rgbValue & 0x00FF00) >>  8))/255.0 \
                 blue:((float)((rgbValue & 0x0000FF) >>  0))/255.0 \
                alpha:1.0]

Verwendungszweck:

label.textColor = UIColorFromRGB(0xBC1128);
Tom
quelle
130
Dies ist großartig, außer dass es nicht das tut, was der Fragesteller verlangt, nämlich einen hexadezimalen STRING in eine UIColor umzuwandeln. Dadurch wird eine Ganzzahl in eine UIColor konvertiert.
Darrinm
31
@ MohamedA.Karim Dies ist ein Beispiel für die Rückgabe einer UIColor aus einer Ganzzahl im Hex-Format (0x ...), nicht aus einer Zeichenfolge im Hex-Format ("# ..."). Großartig, wenn Sie das wollen, aber nicht das, wonach der Fragesteller gefragt hat.
Darrinm
3
@ScottKohlert Ihre Codezeile konvertiert eine Zeichenfolge im Hex-Format (mit dem Präfix "#") in eine andere Zeichenfolge im Hex-Format (mit dem Präfix "0x"). Es wird keine Ganzzahl erzeugt.
Darrinm
1
Wie benutzt man das wie [UIColor whiteColor] .CGColor?
SleepNot
3
Informationen zum Konvertieren einer Zeichenfolge im Hex-Format in eine Ganzzahl zur Verwendung mit diesem Makro finden Sie unter stackoverflow.com/questions/3648411/… .
Devios1
371

Eine prägnante Lösung:

// Assumes input like "#00FF00" (#RRGGBB).
+ (UIColor *)colorFromHexString:(NSString *)hexString {
    unsigned rgbValue = 0;
    NSScanner *scanner = [NSScanner scannerWithString:hexString];
    [scanner setScanLocation:1]; // bypass '#' character
    [scanner scanHexInt:&rgbValue];
    return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:1.0];
}
darrinm
quelle
1
Eine gute Methode für die umgekehrte Konvertierung (z. B. wenn Sie Farben in Kerndaten / einer entfernten Datenbank speichern) finden Sie hier - stackoverflow.com/questions/11884227/…
Eric Goldberg
1
Eine perfekte Lösung. Wenn Ihre Hex-Zeichenfolge von einer (sehr schlecht dokumentierten) API stammt, testen Sie sie unbedingt gegen Hex-Kurzcode wie #FFF oder # FC0. Sie müssen sie in # FFFFFF / # FFCCOO ändern.
Patrick
10
Möglicherweise möchten Sie auch if ( [hexString rangeOfString:@"#"].location == 0 )vor der setScanLocationZeile hinzufügen , um die #Option zu aktivieren.
Devios1
Können Sie bitte die umgekehrte Methode hinzufügen.
Hasan
11
Für die faule: SWIFT- Version hier .
fabian789
188

Ich habe eine Lösung, die zu 100% mit den von Android verwendeten Zeichenfolgen im Hex-Format kompatibel ist, was ich bei der plattformübergreifenden mobilen Entwicklung sehr hilfreich fand. Damit kann ich für beide Plattformen einen Farbgaumen verwenden. Sie können es ohne Namensnennung oder unter der Apache-Lizenz wiederverwenden, wenn Sie dies bevorzugen.

#import "UIColor+HexString.h"

@interface UIColor(HexString)

+ (UIColor *) colorWithHexString: (NSString *) hexString;
+ (CGFloat) colorComponentFrom: (NSString *) string start: (NSUInteger) start length: (NSUInteger) length;

@end


@implementation UIColor(HexString)

+ (UIColor *) colorWithHexString: (NSString *) hexString {
    NSString *colorString = [[hexString stringByReplacingOccurrencesOfString: @"#" withString: @""] uppercaseString];
    CGFloat alpha, red, blue, green;
    switch ([colorString length]) {
        case 3: // #RGB
            alpha = 1.0f;
            red   = [self colorComponentFrom: colorString start: 0 length: 1];
            green = [self colorComponentFrom: colorString start: 1 length: 1];
            blue  = [self colorComponentFrom: colorString start: 2 length: 1];
            break;
        case 4: // #ARGB
            alpha = [self colorComponentFrom: colorString start: 0 length: 1];
            red   = [self colorComponentFrom: colorString start: 1 length: 1];
            green = [self colorComponentFrom: colorString start: 2 length: 1];
            blue  = [self colorComponentFrom: colorString start: 3 length: 1];          
            break;
        case 6: // #RRGGBB
            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];                      
            break;
        case 8: // #AARRGGBB
            alpha = [self colorComponentFrom: colorString start: 0 length: 2];
            red   = [self colorComponentFrom: colorString start: 2 length: 2];
            green = [self colorComponentFrom: colorString start: 4 length: 2];
            blue  = [self colorComponentFrom: colorString start: 6 length: 2];                      
            break;
        default:
            [NSException raise:@"Invalid color value" format: @"Color value %@ is invalid.  It should be a hex value of the form #RBG, #ARGB, #RRGGBB, or #AARRGGBB", hexString];
            break;
    }
    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;
}

@end 
Micah Hainline
quelle
3
in colorComponentFrom:start:length:, solltest du nicht haben return hexComponent / 0xFF; // divide by 255, not 256? Der größte Hex-Wert, den Sie zurückerhalten sollten, ist 0xFF. Dies sollten Sie also durch 0xFF (255) teilen.
Sam
Guter Fang Sam. Bearbeitet, um die Änderung widerzuspiegeln.
Micah Hainline
6
Das ist großartig, Prost. Anstelle einer Kategorie in UIColor können Sie auch eine in NSString erstellen, um Syntax wie[@"#538aa4" toColor]
Dan2552
2
Diese Lösung ist großartig. Ich würde vorschlagen, "Private" für den Namen der privaten Schnittstelle hinzuzufügen, um eine Compiler-Warnung zu vermeiden. @interface UIColor (Private)
djleop
1
Nett. Sie sollten jedoch die andere Funktion in die Benutzeroberfläche einfügen.
Björn Roche
63

Es gibt einen schönen Beitrag darüber, wie man die Frage des OP, ein UIColoraus einem Hex-String zu extrahieren, angeht. Die unten dargestellte Lösung unterscheidet sich von anderen, da sie Zeichenfolgenwerte unterstützt, die '0x' oder '#' enthalten können, die der Hex-Zeichenfolgendarstellung vorangestellt sind ... (siehe Verwendung)

Hier ist das Hauptstück ...

- (UIColor *)getUIColorObjectFromHexString:(NSString *)hexStr alpha:(CGFloat)alpha
{
  // Convert hex string to an integer
  unsigned int hexint = [self intFromHexString:hexStr];

  // Create a color object, specifying alpha as well
  UIColor *color =
    [UIColor colorWithRed:((CGFloat) ((hexint & 0xFF0000) >> 16))/255
    green:((CGFloat) ((hexint & 0xFF00) >> 8))/255
    blue:((CGFloat) (hexint & 0xFF))/255
    alpha:alpha];

  return color;
}

Hilfsmethode ...

- (unsigned int)intFromHexString:(NSString *)hexStr
{
  unsigned int hexInt = 0;

  // Create scanner
  NSScanner *scanner = [NSScanner scannerWithString:hexStr];

  // Tell scanner to skip the # character
  [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"#"]];

  // Scan hex value
  [scanner scanHexInt:&hexInt];

  return hexInt;
}

Verwendungszweck:

NSString *hexStr1 = @"123ABC";
NSString *hexStr2 = @"#123ABC";
NSString *hexStr3 = @"0x123ABC";

UIColor *color1 = [self getUIColorObjectFromHexString:hexStr1 alpha:.9];
NSLog(@"UIColor: %@", color1);

UIColor *color2 = [self getUIColorObjectFromHexString:hexStr2 alpha:.9];
NSLog(@"UIColor: %@", color2);

UIColor *color3 = [self getUIColorObjectFromHexString:hexStr3 alpha:.9];
NSLog(@"UIColor: %@", color3);

Vollständiger Referenzartikel

Swift 2+

Ich habe diese Lösung auf Swift 2.2 portiert. Beachten Sie, dass ich den alphaParameter so geändert habe , dass ein Standardwert von 1,0 verwendet wird. Ich habe auch den int-Typ auf die Anforderungen UInt32der NSScannerKlasse in Swift 2.2 aktualisiert .

func colorWithHexString(hexString: String, alpha:CGFloat = 1.0) -> UIColor {

    // Convert hex string to an integer
    let hexint = Int(self.intFromHexString(hexString))
    let red = CGFloat((hexint & 0xff0000) >> 16) / 255.0
    let green = CGFloat((hexint & 0xff00) >> 8) / 255.0
    let blue = CGFloat((hexint & 0xff) >> 0) / 255.0 

    // Create color object, specifying alpha as well
    let color = UIColor(red: red, green: green, blue: blue, alpha: alpha)
    return color
}

func intFromHexString(hexStr: String) -> UInt32 {
    var hexInt: UInt32 = 0
    // Create scanner
    let scanner: NSScanner = NSScanner(string: hexStr)
    // Tell scanner to skip the # character
    scanner.charactersToBeSkipped = NSCharacterSet(charactersInString: "#")
    // Scan hex value
    scanner.scanHexInt(&hexInt)
    return hexInt
}

Swift 4+

Verwenden der gleichen Logik mit Änderungen für Swift 4,

func colorWithHexString(hexString: String, alpha:CGFloat = 1.0) -> UIColor {

    // Convert hex string to an integer
    let hexint = Int(self.intFromHexString(hexStr: hexString))
    let red = CGFloat((hexint & 0xff0000) >> 16) / 255.0
    let green = CGFloat((hexint & 0xff00) >> 8) / 255.0
    let blue = CGFloat((hexint & 0xff) >> 0) / 255.0

    // Create color object, specifying alpha as well
    let color = UIColor(red: red, green: green, blue: blue, alpha: alpha)
    return color
}

func intFromHexString(hexStr: String) -> UInt32 {
    var hexInt: UInt32 = 0
    // Create scanner
    let scanner: Scanner = Scanner(string: hexStr)
    // Tell scanner to skip the # character
    scanner.charactersToBeSkipped = CharacterSet(charactersIn: "#")
    // Scan hex value
    scanner.scanHexInt32(&hexInt)
    return hexInt
}

Farbhex-Referenzen

HTML-Farbnamen und -codes

Farbhex-Farbcodes

Tommie C.
quelle
Die hier veröffentlichten Swift-Snippets scheinen den Zweck von Optionen in Swift falsch zu verstehen, nämlich Werte zu enthalten, die möglicherweise nie existieren. Die Frage, ob ein Parameter optional sein muss, ist, ob jemand die Möglichkeit benötigt, ihn auf Null zu setzen. Ist es möglicherweise sinnvoll alpha, jemals auf Null gesetzt zu werden? Da diese Methode den Menschen diese Fähigkeit verleiht und sich jemand alphafür Null entscheiden sollte , führt das erzwungene Auspacken dieser Option ausnahmslos zu einem Absturz. Ich habe es jedoch nicht bearbeitet, falls es eine Rechtfertigung gibt, die mir nicht bekannt ist.
Jonathan Thornton
@ JonathanThornton - Danke für die Hinweise. Aufgelöst.
Tommie C.
Die Arbeit an einem Legacy-Projekt und der Objective-C-Lösung funktioniert sehr gut ... außer ... seltsamerweise ... @ "# ffc107" und @ "# e040fb" verweigern die Zusammenarbeit! Gedanken?
Nathaniel
51

Dies ist eine Funktion, die eine Hex-Zeichenfolge verwendet und eine UIColor zurückgibt.
(Sie können Hex-Zeichenfolgen in folgenden Formaten eingeben: #ffffffoder ffffff)

Verwendungszweck:

var color1 = hexStringToUIColor("#d3d3d3")

Swift 4:

func hexStringToUIColor (hex:String) -> UIColor {
    var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()

    if (cString.hasPrefix("#")) {
        cString.remove(at: cString.startIndex)
    }

    if ((cString.count) != 6) {
        return UIColor.gray
    }

    var rgbValue:UInt32 = 0
    Scanner(string: cString).scanHexInt32(&rgbValue)

    return UIColor(
        red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
        green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
        blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
        alpha: CGFloat(1.0)
    )
}

Swift 3:

func hexStringToUIColor (hex:String) -> UIColor {
    var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()

    if (cString.hasPrefix("#")) {
        cString.remove(at: cString.startIndex)
    }

    if ((cString.characters.count) != 6) {
        return UIColor.gray
    }

    var rgbValue:UInt32 = 0
    Scanner(string: cString).scanHexInt32(&rgbValue)

    return UIColor(
        red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
        green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
        blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
        alpha: CGFloat(1.0)
    )
}

Swift 2:

func hexStringToUIColor (hex:String) -> UIColor {
    var cString:String = hex.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet() as NSCharacterSet).uppercaseString

    if (cString.hasPrefix("#")) {
      cString = cString.substringFromIndex(cString.startIndex.advancedBy(1))
    }

    if ((cString.characters.count) != 6) {
      return UIColor.grayColor()
    }

    var rgbValue:UInt32 = 0
    NSScanner(string: cString).scanHexInt(&rgbValue)

    return UIColor(
        red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
        green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
        blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
        alpha: CGFloat(1.0)
    )
}



Quelle: arshad / gist: de147c42d7b3063ef7bc

Ethan Strider
quelle
Ich habe in SVG gesehen, wo es eine kleine Version der Hex-Zeichenfolge mit 3 Zeichen gibt, wie # F0F.
Glenn Howes
Das ist eine Kurzschreibweise, wobei '# F0F' gleich '# FF00FF' ist. Es wäre einfach, eine Funktion zu schreiben, die nach Kurzschrift sucht und diese erweitert.
Ethan Strider
38

Verwenden Sie diese Kategorie:

in der Datei UIColor + Hexadecimal.h

#import <UIKit/UIKit.h>

@interface UIColor(Hexadecimal)

+ (UIColor *)colorWithHexString:(NSString *)hexString;

@end

in der Datei UIColor + Hexadecimal.m

#import "UIColor+Hexadecimal.h"

@implementation UIColor(Hexadecimal)

+ (UIColor *)colorWithHexString:(NSString *)hexString {
    unsigned rgbValue = 0;
    NSScanner *scanner = [NSScanner scannerWithString:hexString];
    [scanner setScanLocation:1]; // bypass '#' character
    [scanner scanHexInt:&rgbValue];

    return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:1.0];
}

@end

In der Klasse möchten Sie es verwenden:

#import "UIColor+Hexadecimal.h"

und:

[UIColor colorWithHexString:@"#6e4b4b"];
Damien Romito
quelle
Kein Alpha-Handling
Ihor Klimov
28

Eine großartige Swift-Implementierung (aktualisiert für Xcode 7) mit Erweiterungen, die aus verschiedenen Antworten und Orten zusammengestellt wurden. Sie benötigen auch die Zeichenfolgenerweiterungen am Ende.

Verwenden:

let hexColor = UIColor(hex: "#00FF00")

HINWEIS: Ich habe eine Option für 2 zusätzliche Ziffern am Ende des 6-stelligen Standard-Hex-Werts für einen Alphakanal hinzugefügt (Übergabewert von 00-99 ). Wenn Sie dies beleidigt, entfernen Sie es einfach. Sie können es implementieren, um einen optionalen Alpha-Parameter zu übergeben.

Erweiterung:

extension UIColor {

    convenience init(var hex: String) {
        var alpha: Float = 100
        let hexLength = hex.characters.count
        if !(hexLength == 7 || hexLength == 9) {
            // A hex must be either 7 or 9 characters (#RRGGBBAA)
            print("improper call to 'colorFromHex', hex length must be 7 or 9 chars (#GGRRBBAA)")
            self.init(white: 0, alpha: 1)
            return
        }

        if hexLength == 9 {
            // Note: this uses String subscripts as given below
            alpha = hex[7...8].floatValue
            hex = hex[0...6]
        }

        // Establishing the rgb color
        var rgb: UInt32 = 0
        let s: NSScanner = NSScanner(string: hex)
        // Setting the scan location to ignore the leading `#`
        s.scanLocation = 1
        // Scanning the int into the rgb colors
        s.scanHexInt(&rgb)

        // Creating the UIColor from hex int
        self.init(
            red: CGFloat((rgb & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((rgb & 0x00FF00) >> 8) / 255.0,
            blue: CGFloat(rgb & 0x0000FF) / 255.0,
            alpha: CGFloat(alpha / 100)
        )
    }
}

String-Erweiterungen:
Float-Quelle
Index-Quelle

extension String {

    /**
    Returns the float value of a string
    */
    var floatValue: Float {
        return (self as NSString).floatValue
    }

    /**
    Subscript to allow for quick String substrings ["Hello"][0...1] = "He"
    */
    subscript (r: Range<Int>) -> String {
        get {
            let start = self.startIndex.advancedBy(r.startIndex)
            let end = self.startIndex.advancedBy(r.endIndex - 1)
            return self.substringWithRange(start..<end)
        }
    }
}
Firo
quelle
Verwenden Sie auch eine String-Erweiterung, um den Index abzurufen? zB stackoverflow.com/a/24144365/3220708
Craig Grummitt
@CraigGrummitt oh mein! Haha, ja. Ich habe eine anständige zusammengestellte Liste von Erweiterungen und Indizes, die ich manchmal (leider) vergesse, was im Standard-Sprachfeaturesatz enthalten ist und was nicht. Ich habe meine Antwort einschließlich der von Ihnen angegebenen Quelle aktualisiert. Ich bin mir nicht sicher, ob ich es überhaupt von dort bekommen habe, aber es sieht sicher genau aus.
Firo
Vielleicht möchten Sie erwähnen, dass es sich um eine String-Erweiterung handelt. Außerdem haben Sie anscheinend die String floatValue-Erweiterung verpasst: stackoverflow.com/a/24088249/3220708 Ansonsten gute Arbeit!
Craig Grummitt
Wo ist countElements () func?
Г И І І
countElements()wurde durch count()in Swift 1.2 ersetzt, es ist in die Sprache eingebaut. Ich habe meine Antwort aktualisiert, um dies widerzuspiegeln.
Firo
27

Sie können eine solche Erweiterung erstellen

extension UIColor{
    convenience init(rgb: UInt, alphaVal: CGFloat) {
        self.init(
            red: CGFloat((rgb & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((rgb & 0x00FF00) >> 8) / 255.0,
            blue: CGFloat(rgb & 0x0000FF) / 255.0,
            alpha: alphaVal
        )
    }
}

Und verwenden Sie es überall so

UIColor(rgb: 0xffffff, alphaVal: 0.2)
Manu Gupta
quelle
Ganz einfach, definitiv mein Favorit.
Theorie
Danke, dieser ist großartig, also prägnant im Vergleich zu anderen Textwänden!
FrankByte.com
nette Funktion, aber sie beantwortet die Frage in keiner Weise.
Mah
@mah Dies ist genau die Frage, die ich denke, wie man eine UIColor aus Hexstring erstellt
Manu Gupta
@ManuGupta Möglicherweise stellen Sie in dieser Antwort fest, dass keine Zeichenfolgen behandelt werden. Eine Hex-Zahl ist keine Hex-Zeichenfolge. Die Frage gibt explizit eine Zeichenfolge an und obwohl sie keine Anführungszeichen enthält,#00FF00 soll sie eindeutig eine Zeichenfolge sein. Wie andere gesagt haben, ist es einfach, prägnant. Wenn es sich jedoch nicht um Zeichenfolgen handelt, kann es möglicherweise keine Frage beantworten, wie mit Zeichenfolgen umgegangen werden soll.
Mah
26

Es gibt keine eingebaute Konvertierung von einer hexadezimalen Zeichenfolge in eine UIColor(oder CGColor), die mir bekannt ist. Sie können jedoch problemlos einige Funktionen für diesen Zweck schreiben - siehe beispielsweise iPhone-Entwicklung, die auf uicolor-Komponenten zugreift

Adam Wright
quelle
3
+1 Wenn Sie ganz nach unten scrollen, lautet die fragliche Methode + colorWithHexString:.
Rob Napier
1
@ RobNapier +colorWithHexString:funktioniert nicht. Zumindest in meinem Fall. :)
6.
15

Ich habe dafür eine gute UIColorKategorie gefunden , UIColor + PXExtensions .

Verwendungszweck: UIColor *mycolor = [UIColor pxColorWithHexValue:@"#BADA55"];

Und für den Fall, dass der Link zu meinem Kern fehlschlägt, finden Sie hier den eigentlichen Implementierungscode:

//
//  UIColor+PXExtensions.m
//

#import "UIColor+UIColor_PXExtensions.h"

@implementation UIColor (UIColor_PXExtensions)

+ (UIColor*)pxColorWithHexValue:(NSString*)hexValue
{
    //Default
    UIColor *defaultResult = [UIColor blackColor];

    //Strip prefixed # hash
    if ([hexValue hasPrefix:@"#"] && [hexValue length] > 1) {
        hexValue = [hexValue substringFromIndex:1];
    }

    //Determine if 3 or 6 digits
    NSUInteger componentLength = 0;
    if ([hexValue length] == 3)
    {
        componentLength = 1;
    }
    else if ([hexValue length] == 6)
    {
        componentLength = 2;
    }
    else
    {
        return defaultResult;
    }

    BOOL isValid = YES;
    CGFloat components[3];

    //Seperate the R,G,B values
    for (NSUInteger i = 0; i < 3; i++) {
        NSString *component = [hexValue substringWithRange:NSMakeRange(componentLength * i, componentLength)];
        if (componentLength == 1) {
            component = [component stringByAppendingString:component];
        }
        NSScanner *scanner = [NSScanner scannerWithString:component];
        unsigned int value;
        isValid &= [scanner scanHexInt:&value];
        components[i] = (CGFloat)value / 256.0f;
    }

    if (!isValid) {
        return defaultResult;
    }

    return [UIColor colorWithRed:components[0]
                           green:components[1]
                            blue:components[2]
                           alpha:1.0];
}

@end
Hlung
quelle
@ PeterDuniho ok, ich habe den Implementierungscode hinzugefügt :)
Hlung
13

schnelle Version. Verwendung als Funktion oder Erweiterung.

Funktion
  func UIColorFromRGB(colorCode: String, alpha: Float = 1.0) -> UIColor{
    var scanner = NSScanner(string:colorCode)
    var color:UInt32 = 0;
    scanner.scanHexInt(&color)

    let mask = 0x000000FF
    let r = CGFloat(Float(Int(color >> 16) & mask)/255.0)
    let g = CGFloat(Float(Int(color >> 8) & mask)/255.0)
    let b = CGFloat(Float(Int(color) & mask)/255.0)

    return UIColor(red: r, green: g, blue: b, alpha: CGFloat(alpha))
}
Erweiterung
extension UIColor {
    convenience init(colorCode: String, alpha: Float = 1.0){
        var scanner = NSScanner(string:colorCode)
        var color:UInt32 = 0;
        scanner.scanHexInt(&color)

        let mask = 0x000000FF
        let r = CGFloat(Float(Int(color >> 16) & mask)/255.0)
        let g = CGFloat(Float(Int(color >> 8) & mask)/255.0)
        let b = CGFloat(Float(Int(color) & mask)/255.0)

        self.init(red: r, green: g, blue: b, alpha: CGFloat(alpha))
    }
}
Wie rufe ich an?
let hexColorFromFunction = UIColorFromRGB("F4C124", alpha: 1.0)
let hexColorFromExtension = UIColor(colorCode: "F4C124", alpha: 1.0)
Sie können auch Ihren Hex ColorFrom Interface Builder definieren.

Geben Sie hier die Bildbeschreibung ein

fatihyildizhan
quelle
12

Dies ist eine weitere Alternative.

- (UIColor *)colorWithRGBHex:(UInt32)hex
{
    int r = (hex >> 16) & 0xFF;
    int g = (hex >> 8) & 0xFF;
    int b = (hex) & 0xFF;

    return [UIColor colorWithRed:r / 255.0f
                           green:g / 255.0f
                            blue:b / 255.0f
                           alpha:1.0f];
}
Gewehr
quelle
alternative Antwort auf eine alternative Frage ... jedoch keine vernünftige Antwort auf die Frage auf dieser Seite.
Mah
11

Sie können verschiedene Online-Tools verwenden, um eine HEX-Zeichenfolge in eine tatsächliche UIColor zu konvertieren. Schauen Sie sich uicolor.org oder UI Color Picker an . Die Ausgabe würde in Objective-C-Code konvertiert, wie:

[UIColor colorWithRed:0.93 green:0.80 blue:0.80 alpha:1.0];

Was Sie in Ihre Anwendung einbetten könnten. Hoffe das hilft!

Zorayr
quelle
Ein weiteres Online-Tool mit demselben Namen ist UI Color Picker .
Joe
Wenn Leute um Hilfe mit Code bitten, um ein ziemlich einfaches Problem wie dieses zu lösen, ist eine Antwort mit der Aufschrift "Zuerst auf eine Online-Site gehen ..." im Allgemeinen nicht annähernd die Antwort, die der Fragesteller wollte.
Mah
11

SWIFT 4

Sie können einen schönen convenienceKonstruktor in der Erweiterung wie folgt erstellen :

extension UIColor {
    convenience init(hexString: String, alpha: CGFloat = 1.0) {
        var hexInt: UInt32 = 0
        let scanner = Scanner(string: hexString)
        scanner.charactersToBeSkipped = CharacterSet(charactersIn: "#")
        scanner.scanHexInt32(&hexInt)

        let red = CGFloat((hexInt & 0xff0000) >> 16) / 255.0
        let green = CGFloat((hexInt & 0xff00) >> 8) / 255.0
        let blue = CGFloat((hexInt & 0xff) >> 0) / 255.0
        let alpha = alpha

        self.init(red: red, green: green, blue: blue, alpha: alpha)
    }
}

Und benutze es später gerne

let color = UIColor(hexString: "#AABBCCDD")
George Maisuradze
quelle
'scanHexInt32' war in iOS 13.0
Cosmo Arun
10
extension UIColor {
    convenience init(hexaString: String, alpha: CGFloat = 1) {
        let chars = Array(hexaString.dropFirst())
        self.init(red:   .init(strtoul(String(chars[0...1]),nil,16))/255,
                  green: .init(strtoul(String(chars[2...3]),nil,16))/255,
                  blue:  .init(strtoul(String(chars[4...5]),nil,16))/255,
                  alpha: alpha)}
}

Verwendungszweck:

let redColor       = UIColor(hexaString: "#FF0000")              // r 1,0 g 0,0 b 0,0 a 1,0
let transparentRed = UIColor(hexaString: "#FF0000", alpha: 0.5)  // r 1,0 g 0,0 b 0,0 a 0,5
Leo Dabus
quelle
7

Das ist schön mit Cocoapod- Unterstützung

https://github.com/mRs-/HexColors

// with hash
NSColor *colorWithHex = [NSColor colorWithHexString:@"#ff8942" alpha:1];

// wihtout hash
NSColor *secondColorWithHex = [NSColor colorWithHexString:@"ff8942" alpha:1];

// short handling
NSColor *shortColorWithHex = [NSColor colorWithHexString:@"fff" alpha:1]
Nath
quelle
Schöne Sachen Bruder :)
Cesarferreira
4

Eine andere Version mit Alpha

#define UIColorFromRGBA(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF000000) >> 24))/255.0 green:((float)((rgbValue & 0xFF0000) >> 16))/255.0 blue:((float)((rgbValue & 0xFF00) >> 8 ))/255.0 alpha:((float)((rgbValue & 0xFF))/255.0)]
Gheese
quelle
4

Schnelles Äquivalent zu @ Toms Antwort, obwohl RGBA Int-Wert zur Unterstützung der Transparenz erhalten wird:

func colorWithHex(aHex: UInt) -> UIColor
{
    return UIColor(red: CGFloat((aHex & 0xFF000000) >> 24) / 255,
        green: CGFloat((aHex & 0x00FF0000) >> 16) / 255,
        blue: CGFloat((aHex & 0x0000FF00) >> 8) / 255,
        alpha: CGFloat((aHex & 0x000000FF) >> 0) / 255)
}

//usage
var color = colorWithHex(0x7F00FFFF)

Und wenn Sie es von einem String aus verwenden möchten, können Sie strtoul verwenden:

var hexString = "0x7F00FFFF"

let num = strtoul(hexString, nil, 16)

var colorFromString = colorWithHex(num)
hris.to.
quelle
4

Hier ist eine Swift 1.2Version, die als Erweiterung zu geschrieben wurde UIColor. Dies ermöglicht es Ihnen zu tun

let redColor = UIColor(hex: "#FF0000")

Was ich für die natürlichste Art halte, es zu tun.

extension UIColor {
  // Initialiser for strings of format '#_RED_GREEN_BLUE_'
  convenience init(hex: String) {
    let redRange    = Range<String.Index>(start: hex.startIndex.advancedBy(1), end: hex.startIndex.advancedBy(3))
    let greenRange  = Range<String.Index>(start: hex.startIndex.advancedBy(3), end: hex.startIndex.advancedBy(5))
    let blueRange   = Range<String.Index>(start: hex.startIndex.advancedBy(5), end: hex.startIndex.advancedBy(7))

    var red     : UInt32 = 0
    var green   : UInt32 = 0
    var blue    : UInt32 = 0

    NSScanner(string: hex.substringWithRange(redRange)).scanHexInt(&red)
    NSScanner(string: hex.substringWithRange(greenRange)).scanHexInt(&green)
    NSScanner(string: hex.substringWithRange(blueRange)).scanHexInt(&blue)

    self.init(
      red: CGFloat(red) / 255,
      green: CGFloat(green) / 255,
      blue: CGFloat(blue) / 255,
      alpha: 1
    )
  }
}
Morgan Wilde
quelle
In Xcode 6.3.2 in der Zeile, die mit beginnt, let greenRange = ...bekomme ich eine Ausnahme:fatal error: can not increment endIndex
Clifton Labrum
@ CliftonLabrum Ich habe dies auf Xcode 7 Beta 3 getestet und es funktioniert genauso. Haben Sie immer noch dieses Problem?
Morgan Wilde
3

Eine weitere Implementierung, die Zeichenfolgen wie "FFF"oder "FFFFFF"und die Verwendung von Alpha ermöglicht:

+ (UIColor *) colorFromHexString:(NSString *)hexString alpha: (CGFloat)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];

    float red = ((baseValue >> 24) & 0xFF)/255.0f;
    float green = ((baseValue >> 16) & 0xFF)/255.0f;
    float blue = ((baseValue >> 8) & 0xFF)/255.0f;

    return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}
Renato Lochetti
quelle
3

aktualisiert für schnelle 1.2

class func colorWithHexString (hex:String) -> UIColor {
    var cString: NSString = hex.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).uppercaseString

    if (cString.hasPrefix("#")) {
        cString = cString.substringFromIndex(1)
    }

    if (count(cString as String) != 6) {
        return UIColor.grayColor()
    }

    var rString: String = cString.substringToIndex(2)
    var gString: String = (cString.substringFromIndex(2) as NSString).substringToIndex(2)
    var bString: String = (cString.substringFromIndex(4) as NSString).substringToIndex(2)

    var r:CUnsignedInt = 0, g:CUnsignedInt = 0, b:CUnsignedInt = 0;
    NSScanner(string: rString).scanHexInt(&r)
    NSScanner(string: gString).scanHexInt(&g)
    NSScanner(string: bString).scanHexInt(&b)
    return UIColor(red: CGFloat(Float(r) / 255.0), green: CGFloat(Float(g) / 255.0), blue: CGFloat(Float(b) / 255.0), alpha: CGFloat(1))

}
RiceAndBytes
quelle
3

Erstellen Sie eine elegante Erweiterung für UIColor:

extension UIColor {

convenience init(string: String) {

        var uppercasedString = string.uppercased()
        uppercasedString.remove(at: string.startIndex)

        var rgbValue: UInt32 = 0
        Scanner(string: uppercasedString).scanHexInt32(&rgbValue)

        let red = CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0
        let green = CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0
        let blue = CGFloat(rgbValue & 0x0000FF) / 255.0

        self.init(red: red, green: green, blue: blue, alpha: 1)
    }
}

Erstellen Sie rote Farbe:

let red = UIColor(string: "#ff0000") 
Bartłomiej Semańczyk
quelle
3
extension UIColor 
{
    class func fromHexaString(hex:String) -> UIColor
    {
        let scanner           = Scanner(string: hex)
        scanner.scanLocation  = 0
        var rgbValue: UInt64  = 0
        scanner.scanHexInt64(&rgbValue)

        return UIColor(
            red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
            blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
            alpha: CGFloat(1.0)
        )
    }
}

//you can call like this.

UIColor.fromHexaString(hex:3276b1)
Vinayak
quelle
2
 You Can Get UIColor From String Code Like
   circularSpinner.fillColor = [self getUIColorObjectFromHexString:@"27b8c8" alpha:9];

 //Function For Hex Color Use
    - (unsigned int)intFromHexString:(NSString *)hexStr
    {
        unsigned int hexInt = 0;

        // Create scanner
        NSScanner *scanner = [NSScanner scannerWithString:hexStr];

        // Tell scanner to skip the # character
        [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"#"]];

        // Scan hex value
        [scanner scanHexInt:&hexInt];

        return hexInt;
    }




    - (UIColor *)getUIColorObjectFromHexString:(NSString *)hexStr alpha:(CGFloat)alpha
    {
        // Convert hex string to an integer
        unsigned int hexint = [self intFromHexString:hexStr];

        // Create color object, specifying alpha as well
        UIColor *color =
        [UIColor colorWithRed:((CGFloat) ((hexint & 0xFF0000) >> 16))/255
                        green:((CGFloat) ((hexint & 0xFF00) >> 8))/255
                         blue:((CGFloat) (hexint & 0xFF))/255
                        alpha:alpha];

        return color;
    }

    /Function For Hex Color Use
    - (unsigned int)intFromHexString:(NSString *)hexStr
    {
        unsigned int hexInt = 0;

        // Create scanner
        NSScanner *scanner = [NSScanner scannerWithString:hexStr];

        // Tell scanner to skip the # character
        [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"#"]];

        // Scan hex value
        [scanner scanHexInt:&hexInt];

        return hexInt;
    }




    - (UIColor *)getUIColorObjectFromHexString:(NSString *)hexStr alpha:(CGFloat)alpha
    {
        // Convert hex string to an integer
        unsigned int hexint = [self intFromHexString:hexStr];

        // Create color object, specifying alpha as well
        UIColor *color =
        [UIColor colorWithRed:((CGFloat) ((hexint & 0xFF0000) >> 16))/255
                        green:((CGFloat) ((hexint & 0xFF00) >> 8))/255
                         blue:((CGFloat) (hexint & 0xFF))/255
                        alpha:alpha];

        return color;
    }
Manish Saini
quelle
Wenn Sie diesen Code verwenden möchten, rufen Sie [self getUIColorObjectFromHexString: @ "27b8c8" alpha: 9] auf. nur ....
Manish Saini
2

Ich mag es, das Alpha neben der Farbe zu gewährleisten, also schreibe ich meine eigene Kategorie

+ (UIColor *) colorWithHex:(int)color {

    float red = (color & 0xff000000) >> 24;
    float green = (color & 0x00ff0000) >> 16;
    float blue = (color & 0x0000ff00) >> 8;
    float alpha = (color & 0x000000ff);

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

einfach so zu bedienen

[UIColor colorWithHex:0xFF0000FF]; //Red
[UIColor colorWithHex:0x00FF00FF]; //Green
[UIColor colorWithHex:0x00FF00FF]; //Blue
[UIColor colorWithHex:0x0000007F]; //transparent black
adali
quelle
2

Ich habe dafür eine Convenience-Init erstellt:

extension UIColor {
convenience init(hex: String, alpha: CGFloat)
{
    let redH = CGFloat(strtoul(hex.substringToIndex(advance(hex.startIndex,2)), nil, 16))
    let greenH = CGFloat(strtoul(hex.substringWithRange(Range<String.Index>(start: advance(hex.startIndex, 2), end: advance(hex.startIndex, 4))), nil, 16))
    let blueH = CGFloat(strtoul(hex.substringFromIndex(advance(hex.startIndex,4)), nil, 16))

    self.init(red: redH/255, green: greenH/255, blue: blueH/255, alpha: alpha)
}
}

Dann können Sie eine UIColor überall in Ihrem Projekt wie folgt erstellen:

UIColor(hex: "ffe3c8", alpha: 1)

hoffe das hilft...

Lucas Martins Juviniano
quelle
2

Sie können die Erweiterungsklasse von UIColor wie folgt erstellen: -

Erweiterung UIColor {

// MARK: - getColorFromHex / ** Diese Funktion konvertiert den Hex-Farbcode in RGB.

- parameter color  hex string.

- returns: RGB color code.
*/
class func getColorFromHex(hexString:String)->UIColor{

    var rgbValue : UInt32 = 0
    let scanner:NSScanner =  NSScanner(string: hexString)

    scanner.scanLocation = 1
    scanner.scanHexInt(&rgbValue)

    return UIColor(red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0, green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0, blue: CGFloat(rgbValue & 0x0000FF) / 255.0, alpha: CGFloat(1.0))
}

}}

Abhishek Verma
quelle
2

Für schnelle 2.0+. Dieser Code funktioniert gut für mich.

extension UIColor {
    /// UIColor(hexString: "#cc0000")
    internal convenience init?(hexString:String) {
        guard hexString.characters[hexString.startIndex] == Character("#") else {
            return nil
        }
        guard hexString.characters.count == "#000000".characters.count else {
            return nil
        }
        let digits = hexString.substringFromIndex(hexString.startIndex.advancedBy(1))
        guard Int(digits,radix:16) != nil else{
            return nil
        }
        let red = digits.substringToIndex(digits.startIndex.advancedBy(2))
        let green = digits.substringWithRange(Range<String.Index>(start: digits.startIndex.advancedBy(2),
            end: digits.startIndex.advancedBy(4)))
        let blue = digits.substringWithRange(Range<String.Index>(start:digits.startIndex.advancedBy(4),
            end:digits.startIndex.advancedBy(6)))
        let redf = CGFloat(Double(Int(red, radix:16)!) / 255.0)
        let greenf = CGFloat(Double(Int(green, radix:16)!) / 255.0)
        let bluef = CGFloat(Double(Int(blue, radix:16)!) / 255.0)
        self.init(red: redf, green: greenf, blue: bluef, alpha: CGFloat(1.0))
    }
}

Dieser Code enthält die Überprüfung des Zeichenfolgenformats. z.B

let aColor = UIColor(hexString: "#dadada")!
let failed = UIColor(hexString: "123zzzz")

Und soweit ich weiß, ist mein Code kein Nachteil, da er die Semantik eines fehlerhaften Zustands beibehält und einen optionalen Wert zurückgibt. Und das sollte die beste Antwort sein.

AntiMoron
quelle
2

Die Swift 2.0- Version der Lösung, die den Alpha-Wert der Farbe und die perfekte Fehlerbehandlung verarbeitet, ist hier:

func RGBColor(hexColorStr : String) -> UIColor?{

    var red:CGFloat = 0.0
    var green:CGFloat = 0.0
    var blue:CGFloat = 0.0
    var alpha:CGFloat = 1.0

    if hexColorStr.hasPrefix("#"){

        let index   = hexColorStr.startIndex.advancedBy(1)
        let hex     = hexColorStr.substringFromIndex(index)
        let scanner = NSScanner(string: hex)
        var hexValue: CUnsignedLongLong = 0

        if scanner.scanHexLongLong(&hexValue)
        {
            if hex.characters.count == 6
            {
                red   = CGFloat((hexValue & 0xFF0000) >> 16) / 255.0
                green = CGFloat((hexValue & 0x00FF00) >> 8)  / 255.0
                blue  = CGFloat(hexValue & 0x0000FF) / 255.0
            }
            else if hex.characters.count == 8
            {
                red   = CGFloat((hexValue & 0xFF000000) >> 24) / 255.0
                green = CGFloat((hexValue & 0x00FF0000) >> 16) / 255.0
                blue  = CGFloat((hexValue & 0x0000FF00) >> 8)  / 255.0
                alpha = CGFloat(hexValue & 0x000000FF)         / 255.0
            }
            else
            {
                print("invalid hex code string, length should be 7 or 9", terminator: "")
                return nil
            }
        }
        else
        {
            print("scan hex error")
       return nil
        }
    }

    let color: UIColor =  UIColor(red:CGFloat(red), green: CGFloat(green), blue:CGFloat(blue), alpha: alpha)
    return color
}
Teja Kumar Bethina
quelle
2
    //UIColorWithHexString

    static UIColor * UIColorWithHexString(NSString *hex) {
        unsigned int rgb = 0;
        [[NSScanner scannerWithString:
          [[hex uppercaseString] stringByTrimmingCharactersInSet:
           [[NSCharacterSet characterSetWithCharactersInString:@"0123456789ABCDEF"] invertedSet]]]
         scanHexInt:&rgb];
        return [UIColor colorWithRed:((CGFloat)((rgb & 0xFF0000) >> 16)) / 255.0
                               green:((CGFloat)((rgb & 0xFF00) >> 8)) / 255.0
                                blue:((CGFloat)(rgb & 0xFF)) / 255.0
                               alpha:1.0];
    }

Verwendungszweck

self.view.backgroundColor = UIColorWithHexString(@"#0F35C0");
Usman
quelle