Bagaimana saya bisa membuat UIColor dari string hex?

Jawaban:

722

Saya telah menemukan cara paling sederhana untuk melakukan ini adalah dengan makro. Cukup sertakan di header Anda dan itu tersedia di seluruh proyek Anda.

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

makro uicolor dengan nilai hex

Versi kode ini juga diformat:

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

Pemakaian:

label.textColor = UIColorFromRGB(0xBC1128);
Tom
sumber
130
Ini bagus kecuali itu tidak melakukan apa yang diminta penanya, yaitu mengubah hex STRING menjadi UIColor. Ini mengonversi bilangan bulat ke UIColor.
darrinm
31
@ MohamedA.Karim Itu adalah contoh pengembalian UIColor dari integer format hex (0x ...) bukan string format hex ("# ..."). Hebat jika itu yang Anda inginkan, tetapi bukan yang diminta si penanya.
darrinm
3
@ScottKohlert Baris kode Anda mengubah satu string format hex (diawali dengan "#") menjadi string format hex lain (diawali dengan "0x"). Itu tidak menghasilkan bilangan bulat.
darrinm
1
Bagaimana cara menggunakan ini seperti [UIColor whiteColor] .CGColor?
SleepNot
3
Untuk mengonversi string format hex ke integer untuk digunakan dengan makro ini, lihat stackoverflow.com/questions/3648411/… .
devios1
371

Solusi ringkas:

// 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
sumber
1
Dan metode yang baik untuk melakukan konversi terbalik (seperti jika Anda menyimpan warna dalam data inti / basis data jauh) dapat ditemukan di sini - stackoverflow.com/questions/11884227/…
Eric Goldberg
1
Solusi sempurna. Jika hex string Anda berasal dari API (sangat buruk didokumentasikan), pastikan untuk menguji terhadap kode hex steno seperti #FFF atau # FC0. Anda harus mengubahnya ke # FFFFFF / # FFCCOO.
Patrick
10
Anda mungkin juga ingin menambahkan if ( [hexString rangeOfString:@"#"].location == 0 )sebelum setScanLocationbaris untuk membuat #opsional.
devios1
dapatkah Anda menambahkan metode sebaliknya.
hasan
11
Untuk yang malas: versi SWIFT di sini .
fabian789
188

Saya punya solusi yang 100% kompatibel dengan string format hex yang digunakan oleh Android, yang saya temukan sangat membantu ketika melakukan pengembangan mobile lintas platform. Ini memungkinkan saya menggunakan satu warna langit-langit untuk kedua platform. Jangan ragu untuk menggunakan kembali tanpa atribusi, atau di bawah lisensi Apache jika Anda mau.

#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
sumber
3
di colorComponentFrom:start:length:, tidak seharusnya Anda miliki return hexComponent / 0xFF; // divide by 255, not 256? Nilai hex terbesar yang harus Anda dapatkan kembali adalah 0xFF, jadi itulah yang harus Anda bagi dengan 0xFF (255).
Sam
Bagus tangkap Sam. Diedit untuk mencerminkan perubahan.
Micah Hainline
6
Ini bagus, tepuk tangan. Selain itu, alih-alih kategori di UIColor, Anda dapat membuatnya di NSString untuk dapat memiliki sintaksis seperti[@"#538aa4" toColor]
Dan2552
2
Solusi ini bagus, saya akan menyarankan untuk menambahkan "Pribadi" untuk nama antarmuka pribadi untuk menghindari peringatan kompiler. @interface UIColor (Private)
djleop
1
Bagus. Anda harus meletakkan fungsi lain di antarmuka.
Bjorn Roche
63

Ada posting bagus tentang cara mengatasi pertanyaan OP tentang mengekstraksi UIColordari string hex. Solusi yang disajikan di bawah berbeda dari yang lain karena mendukung nilai string yang mungkin termasuk '0x' atau '#' diawali ke representasi string hex ... (lihat penggunaan)

Inilah bagian utamanya ...

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

Metode pembantu ...

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

Pemakaian:

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

Artikel Referensi Lengkap

Swift 2+

Saya telah mem-porting solusi ini ke Swift 2.2. Perhatikan bahwa saya telah mengubah alphaparameter untuk menggunakan set default ke 1.0. Saya juga memperbarui tipe int UInt32seperti yang diminta oleh NSScannerkelas di Swift 2.2.

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+

Menggunakan logika yang sama dengan perubahan yang diterapkan untuk 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
}

Referensi Hex Warna

Nama dan Kode Warna HTML

Warna Hex Kode Warna

Tommie C.
sumber
Cuplikan Swift yang diposting di sini tampaknya salah memahami tujuan opsional di Swift, yang berisi nilai yang mungkin tidak pernah ada. Pertanyaan untuk ditanyakan apakah suatu parameter perlu menjadi opsional adalah apakah seseorang mungkin perlu kemampuan untuk mengaturnya menjadi nol. Apakah itu mungkin masuk akal untuk alphauntuk pernah diisi nil? Karena metode ini memberi orang kemampuan itu, dan jika seseorang harus memutuskan untuk menetapkan alphanol, dipaksa membuka bungkus opsional itu akan selalu menyebabkan crash. Saya belum mengeditnya, kalau-kalau ada beberapa pembenaran yang saya tidak sadari.
Jonathan Thornton
@JonathanThornton - Terima kasih atas pimpinannya. Terselesaikan.
Tommie C.
Bekerja pada proyek warisan dan solusi Objective-C bekerja dengan sangat baik ... kecuali ... anehnya ... @ "# ffc107" dan @ "# e040fb" menolak untuk bekerja sama! Pikiran?
Nathaniel
51

Ini adalah fungsi yang mengambil string hex dan mengembalikan UIColor.
(Anda dapat memasukkan string hex dengan format: #ffffffatau ffffff)

Pemakaian:

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



Sumber: arshad / inti: de147c42d7b3063ef7bc

Ethan Strider
sumber
Saya pernah melihat di SVG, di mana ada versi kecil dari string hex dengan 3 karakter, seperti # F0F.
Glenn Howes
Itu adalah notasi steno, di mana '# F0F' setara dengan '# FF00FF'. Akan mudah untuk menulis fungsi yang memeriksa steno dan memperluasnya.
Ethan Strider
38

Gunakan Kategori ini:

dalam file UIColor + Hexadecimal.h

#import <UIKit/UIKit.h>

@interface UIColor(Hexadecimal)

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

@end

dalam file 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

Di Kelas Anda ingin menggunakannya:

#import "UIColor+Hexadecimal.h"

dan:

[UIColor colorWithHexString:@"#6e4b4b"];
Damien Romito
sumber
Tidak ada penanganan alpha
Ihor Klimov
28

Implementasi Swift yang hebat (diperbarui untuk Xcode 7) menggunakan ekstensi, disatukan dari berbagai jawaban dan tempat yang berbeda. Anda juga akan membutuhkan ekstensi string di bagian akhir.

Menggunakan:

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

CATATAN: Saya menambahkan opsi untuk 2 digit tambahan ke akhir nilai hex 6 digit standar untuk saluran alpha (nilai lulus dari 00-99 ). Jika ini menyinggung Anda, hapus saja. Anda bisa menerapkannya untuk meneruskan parameter alpha opsional.

Perpanjangan:

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

Ekstensi string:
Sumber langganan sumber float

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
sumber
Apakah Anda juga menggunakan ekstensi String untuk mendapatkan subskripnya? misalnya stackoverflow.com/a/24144365/3220708
Craig Grummitt
@CraigGrummitt oh my! Haha iya. Saya memiliki daftar ekstensi dan subskrip yang dikompilasi dengan baik yang kadang-kadang (sayangnya) saya lupa apa yang termasuk dan tidak termasuk dalam rangkaian fitur bahasa standar. Saya memperbarui jawaban saya termasuk sumber yang Anda berikan. Tidak yakin apakah saya mendapatkannya dari sana tetapi terlihat sangat dekat.
Firo
Anda mungkin ingin menyebutkan bahwa itu adalah ekstensi String. Anda juga sepertinya melewatkan ekstensi String floatValue: stackoverflow.com/a/24088249/3220708 Selain itu, kerja bagus!
Craig Grummitt
Di mana countElements () func?
Ε Г И І И О
countElements()diganti dengan count()dalam Swift 1.2, itu dibangun ke dalam bahasa. Saya memperbarui jawaban saya untuk mencerminkan hal itu.
Firo
27

Anda dapat membuat ekstensi seperti ini

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

Dan gunakan di mana saja seperti ini

UIColor(rgb: 0xffffff, alphaVal: 0.2)
Manu Gupta
sumber
Sederhana, pasti favorit saya.
teori
Terima kasih, ini hebat, sangat ringkas dibandingkan dengan dinding teks lainnya!
FrankByte.com
fungsi yang bagus tetapi tidak dengan cara apa pun menjawab pertanyaan.
Mah
@mah Ini persis pertanyaan yang saya pikirkan, bagaimana membuat UIColor dari hexstring
Manu Gupta
@ ManuGupta Anda mungkin melihat tidak adanya penanganan string dalam jawaban ini. Nomor hex bukan string hex. Pertanyaan secara eksplisit menyatakan string dan meskipun tidak memiliki tanda kutip di dalamnya, #00FF00jelas dimaksudkan untuk menjadi string karakter. Seperti yang orang lain katakan itu sederhana, ringkas. Tetapi jika tidak berurusan dengan string, maka tidak mungkin menjawab pertanyaan yang menanyakan bagaimana menangani string.
mah
26

Tidak ada konversi bawaan dari string heksadesimal ke UIColor(atau CGColor) yang saya ketahui. Namun, Anda dapat dengan mudah menulis beberapa fungsi untuk tujuan ini - misalnya, lihat pengembangan iphone mengakses komponen uicolor

Adam Wright
sumber
3
+1 Jika Anda menggulir ke bawah, metode yang dimaksud adalah + colorWithHexString :.
Rob Napier
1
@RobNapier +colorWithHexString:tidak berfungsi. Setidaknya dalam kasus saya. :)
पवन
15

Saya menemukan UIColorkategori yang bagus untuk ini, UIColor + PXExtensions .

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

Dan, untuk berjaga-jaga jika tautan ke intisari saya gagal, berikut adalah kode implementasi yang sebenarnya:

//
//  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
Hung
sumber
@PeterDuniho ok, saya menambahkan kode implementasi :)
Hlung
13

versi cepat. Gunakan sebagai Fungsi atau Ekstensi.

Fungsi
  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))
}
Perpanjangan
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))
    }
}
Bagaimana cara menelepon
let hexColorFromFunction = UIColorFromRGB("F4C124", alpha: 1.0)
let hexColorFromExtension = UIColor(colorCode: "F4C124", alpha: 1.0)
Anda juga dapat menentukan Hex Colordari pembuat antarmuka Anda.

masukkan deskripsi gambar di sini

fatihyildizhan
sumber
12

Ini adalah alternatif lain.

- (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];
}
Senjata
sumber
jawaban alternatif untuk pertanyaan alternatif ... bukan jawaban yang masuk akal untuk pertanyaan di halaman ini.
Mah
11

Anda bisa menggunakan berbagai alat online untuk mengonversi string HEX ke UIColor yang sebenarnya. Lihat uicolor.org atau UI Color Picker . Output akan dikonversi menjadi kode Objective-C, seperti:

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

Yang dapat Anda sematkan di aplikasi Anda. Semoga ini membantu!

Zorayr
sumber
Alat online lain, nama yang sama sebenarnya, UI Color Picker .
Joe
Umumnya ketika orang meminta bantuan dengan kode untuk menyelesaikan masalah yang cukup sederhana seperti ini, jawaban yang mengatakan "pertama pergi ke beberapa situs online ..." benar-benar bahkan tidak mendekati menjadi jawaban yang diinginkan si penanya.
Mah
11

SWIFT 4

Anda dapat membuat conveniencekonstruktor yang bagus di ekstensi seperti ini:

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

Dan menggunakannya nanti seperti

let color = UIColor(hexString: "#AABBCCDD")
George Maisuradze
sumber
'scanHexInt32' sudah tidak digunakan lagi di 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)}
}

Pemakaian:

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
sumber
7

Ini bagus dengan dukungan cocoapod

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
sumber
Beautiful stuff bro :)
cesarferreira
4

Versi lain dengan 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
sumber
4

Setara dengan jawaban @ Tom, walaupun menerima nilai Int RGBA untuk mendukung transparansi:

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)

Dan jika Anda ingin dapat menggunakannya dari string, Anda bisa menggunakan strtoul:

var hexString = "0x7F00FFFF"

let num = strtoul(hexString, nil, 16)

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

Berikut adalah Swift 1.2versi yang ditulis sebagai ekstensi untuk UIColor. Ini memungkinkan Anda melakukannya

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

Yang saya rasakan adalah cara paling alami untuk melakukannya.

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
sumber
Dalam Xcode 6.3.2 pada baris yang dimulai dengan let greenRange = ...saya mendapatkan pengecualian:fatal error: can not increment endIndex
Clifton Labrum
@CliftonLabrum Saya sudah menguji ini pada Xcode 7 beta 3, dan kerjanya sama. Apakah Anda masih mengalami masalah ini?
Morgan Wilde
3

Implementasi lain yang memungkinkan string menyukai "FFF"atau "FFFFFF"dan menggunakan alpha:

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

diperbarui untuk cepat 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
sumber
3

Buat ekstensi elegan untuk 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)
    }
}

Buat warna merah:

let red = UIColor(string: "#ff0000") 
Bartłomiej Semańczyk
sumber
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
sumber
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
sumber
jika Anda ingin menggunakan kode ini, maka Anda memanggil [self getUIColorObjectFromHexString: @ "27b8c8" alpha: 9]; hanya ....
Manish Saini
2

Saya ingin memastikan alfa selain warnanya, jadi saya menulis kategori saya sendiri

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

mudah digunakan seperti ini

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

Saya membuat kenyamanan untuk itu:

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

maka Anda dapat membuat UIColor di mana saja di proyek Anda seperti ini:

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

semoga ini membantu...

Lucas Martins Juviniano
sumber
2

Anda dapat membuat kelas ekstensi UIColor sebagai: -

ekstensi UIColor {

// MARK: - getColorFromHex / ** Fungsi ini akan mengubah kode Hex warna menjadi 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
sumber
2

Untuk cepat 2.0+. Kode ini berfungsi dengan baik untuk saya.

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

Kode ini termasuk pemeriksaan format string. misalnya

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

Dan sejauh yang saya tahu, kode saya tidak ada salahnya untuk mempertahankan semantik kondisi gagal dan mengembalikan nilai opsional. Dan ini harus menjadi jawaban terbaik.

AntiMoron
sumber
2

Solusi versi Swift 2.0 yang akan menangani nilai warna alfa dan dengan penanganan kesalahan yang sempurna ada di sini:

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

Pemakaian

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