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

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

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 

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


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


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"];

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

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)

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


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

@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


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

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!


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

'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

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]

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

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)

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

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

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

}

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

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)

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

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

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


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

}


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.


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
}

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");
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.