Onaltılık bir dizeden nasıl UIColor oluşturabilirim?


Yanıtlar:


722

Bunu yapmanın en basit yolunu bir makro ile buldum. Sadece başlığınıza ekleyin ve proje boyunca kullanılabilir.

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

onaltılık değerlere sahip uicolor makro

Ayrıca bu kodun biçimlendirilmiş sürümü:

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

Kullanımı:

label.textColor = UIColorFromRGB(0xBC1128);

130
Bu harika bir soru sorusunun istediği şeyi yapmaması dışında bir hex STRING'i bir UIColor'a dönüştürmektir. Bu, bir tamsayıyı bir UIColor'a dönüştürür.
darrinm

31
@ MohamedA.Karim Bu, bir UIColor'u onaltılık biçim dizesinden ("# ...") değil onaltılık bir tamsayıdan (0x ...) döndürmenin bir örneğidir. Harika, eğer istediğin buysa, ama sorgulayıcının istediği şey değil.
darrinm

3
@ScottKohlert Kod satırınız bir onaltılık biçim dizesini ("#" ile ön ekli) başka bir onaltılık biçim dizesine ("0x" ön ekiyle) dönüştürür. Bir tamsayı üretmez.
darrinm

1
[UIColor whiteColor] .CGColor gibi nasıl kullanılır?
SleepNot

3
Onaltılık biçim dizesini bu makro ile kullanmak üzere bir tam sayıya dönüştürmek için bkz. Stackoverflow.com/questions/3648411/… .
devios1

371

Kısa bir çözüm:

// 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
Ve ters dönüşümü yapmak için iyi bir yöntem (renkleri temel verilerde / uzak bir veritabanında saklıyorsanız gibi) burada bulabilirsiniz - stackoverflow.com/questions/11884227/…
Eric Goldberg

1
Mükemmel bir çözüm. Onaltılık dizeniz (çok kötü belgelenmiş) bir API'dan geliyorsa, #FFF veya # FC0 gibi kısayol hex kodlarına karşı test ettiğinizden emin olun. Bunları # FFFFFF / # FFCCOO olarak değiştirmeniz gerekir.
Patrick

10
İsteğe bağlı yapmak için satırdan if ( [hexString rangeOfString:@"#"].location == 0 )önce eklemek de isteyebilirsiniz . setScanLocation#
devios1

ters yöntemi ekleyebilir misiniz?
hasan

11
: Tembel için SWIFT sürümü burada .
fabian789

188

Platformlar arası mobil geliştirme yaparken çok yararlı bulduğum, Android tarafından kullanılan onaltılık biçim dizeleriyle% 100 uyumlu bir çözümüm var. Her iki platform için bir renk damak kullanmama izin veriyor. Atıf olmadan veya tercih ederseniz Apache lisansı altında tekrar kullanmaktan çekinmeyin.

#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
içinde colorComponentFrom:start:length:, değil mi return hexComponent / 0xFF; // divide by 255, not 256? Geri almanız gereken en büyük hex değeri 0xFF'dir, bu nedenle 0xFF (255) 'e bölmelisiniz.
Sam

Sam'i yakala. Değişikliği yansıtacak şekilde düzenlendi.
Micah Hainline

6
Bu harika, şerefe. Ayrıca, UIColor'da bir kategori yerine, NSString'de sözdizimine sahip olmak için bir tane yapabilirsiniz[@"#538aa4" toColor]
Dan2552

2
Bu çözüm harika, derleyici uyarısından kaçınmak için özel arayüzün adı için "Özel" eklemenizi öneririm. @interface UIColor (Özel)
djleop

1
Güzel. Yine de diğer işlevi arayüze koymalısınız .
Bjorn Roche

63

OP'nin bir şirketin çıkarılması sorunuyla nasıl başa çıkılacağı konusunda güzel bir yazı var. UIColor onaltılık bir dizeden bir . Aşağıda sunulan çözüm, onaltılık dize temsiline önek eklenmiş '0x' veya '#' içerebilecek dize değerlerini desteklediğinden diğerlerinden farklıdır ... (kullanıma bakın)

İşte ana parça ...

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

Yardımcı yöntem ...

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

Kullanımı:

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

Komple Referans Makalesi

Hızlı 2+

Bu çözümü Swift 2.2'ye taşıdım. alphaParametreyi varsayılan olarak 1.0 olarak kullanmak üzere değiştirdiğimi unutmayın . Ayrıca int 2.2 Swift 2.2 sınıf UInt32gerektirdiği gibi güncelledim NSScanner.

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+

Hızlı 4 için uygulanan değişikliklerle aynı mantığı kullanarak,

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
}

Renk Hex Referansları

HTML Renk Adları ve Kodları

Renk Altıgen Renk Kodları


Burada yayınlanan Swift snippet'leri, Swift'te hiçbir zaman var olmayabilecek değerleri içeren seçeneklerin amacını yanlış anlamış gibi görünüyor. Bir parametrenin isteğe bağlı olması gerekip gerekmediği sorulması gereken soru, birinin bunu nil olarak ayarlayabilme yeteneğine ihtiyaç duyup duymayacağıdır. Muhtemelen için mantıklı mı alphaiçin hiç nil ayarlanmalıdır? Bu yöntem insanlara bu yeteneği verdiğinden ve eğer birisi alphanil olarak ayarlanmaya karar verirse , bu isteğe bağlı zorla sarma her zaman bir çökmeye yol açacaktır. Bununla birlikte, farkında olmadığım bir gerekçe olması durumunda, bunu düzenlemedim.
Jonathan Thornton

@JonathanThornton - Uyarı için teşekkürler. Çözülmüş.
Tommie C.

Eski bir proje ve Objective-C çözümü üzerinde çalışmak çok iyi çalışıyor ... hariç ... tuhaf ... @ "# ffc107" ve @ "# e040fb" işbirliği yapmayı reddediyor! Düşünceler?
Nathaniel

51

Bu, onaltılı bir dize alan ve bir UIColor döndüren bir işlevdir.
(Onaltılı dizeleri şu biçimlerden biriyle girebilirsiniz: #ffffffveya ffffff)

Kullanımı:

var color1 = hexStringToUIColor("#d3d3d3")

Hızlı 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)
    )
}

Hızlı 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)
    )
}

Hızlı 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)
    )
}



Kaynak: arshad / gist: de147c42d7b3063ef7bc


SVG'de, # F0F gibi 3 karakterli onaltılık dizenin küçük bir sürümünün olduğu bir yerde gördüm.
Glenn Howes

Bu, '# F0F' ifadesinin '# FF00FF' ile eşdeğer olduğu steno gösterimi. Stenoyu kontrol eden ve genişleten bir işlev yazmak basit olurdu.
Ethan Strider

38

Bu Kategoriyi Kullan:

UIColor + Hexadecimal.h dosyasında

#import <UIKit/UIKit.h>

@interface UIColor(Hexadecimal)

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

@end

UIColor + Hexadecimal.m dosyasında

#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

Sınıfta kullanmak istiyorsunuz:

#import "UIColor+Hexadecimal.h"

ve:

[UIColor colorWithHexString:@"#6e4b4b"];

Alfa kullanımı yok
Ihor Klimov

28

Uzantıları kullanan harika bir Swift uygulaması (Xcode 7 için güncellendi), çeşitli farklı cevaplardan ve yerlerden bir araya getirildi. Sonunda dize uzantılarına da ihtiyacınız olacak.

kullanın:

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

NOT: Bir alfa kanalı için standart 6 basamaklı onaltılık değerin sonuna 2 ek basamak için bir seçenek ekledim ( 00-99 ). Bu sizi rahatsız ediyorsa, kaldırın. İsteğe bağlı bir alfa parametresine iletmek için uygulayabilirsiniz.

Uzantı:

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

Dize uzantıları:
Kayan nokta kaynağı
Alt simge kaynağı

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

Ayrıca alt dizesini almak için bir String uzantısı mı kullanıyorsunuz? örneğin stackoverflow.com/a/24144365/3220708
Craig Grummitt

@CraigGrummitt oh benim! Haha evet. Ben (ne yazık ki) standart dil özellik kümesine dahil olan ve olmayan unutmak uzantıları ve abonelik iyi bir derlenmiş listem var. Verdiğiniz kaynak dahil cevabımı güncelledim. Ben oradan bile var emin değilim ama emin yakından görünüyor.
15'te Firo

Bunun bir String uzantısı olduğunu belirtmek isteyebilirsiniz. Ayrıca String floatValue uzantısını kaçırmışsınız gibi görünüyor: stackoverflow.com/a/24088249/3220708 Bunun dışında iyi iş çıkardınız !
Craig Grummitt

CountElements () işlevi nerede?
Г И І И О

countElements()count()Swift 1.2 ile değiştirildi , dile inşa edildi. Cevabımı bunu yansıtacak şekilde güncelledim.
Firo

27

Bunun gibi bir uzantı yapabilirsiniz

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

Ve böyle bir yerde kullanın

UIColor(rgb: 0xffffff, alphaVal: 0.2)

Ölü basit, kesinlikle benim favorim.
teori

Teşekkürler, bu harika, metnin diğer duvarlarına kıyasla çok özlü!
FrankByte.com

güzel fonksiyon ama hiçbir şekilde soruya cevap vermez.
mah

@mah Bu tam olarak bence soru, hexstring'den bir UIColor nasıl oluşturulur
Manu Gupta

@ManuGupta, bu cevapta herhangi bir dize işlemenin tamamen eksik olduğunu fark edebilirsiniz. Onaltılık sayı onaltılık bir dize değildir. Soru açıkça bir dizeyi belirtir ve içinde tırnak işaretleri olmamasına rağmen #00FF00, açıkça bir karakter dizesi olması amaçlanmıştır. Diğerlerinin söylediği gibi basit, özlü. Ancak dizelerle ilgilenmiyorsa, dizelerle nasıl başa çıkılacağını soran bir soruyu yanıtlayamaz.
mah

26

Onaltılık bir dizeden farkında olduğum bir UIColor(veya CGColor) biçimine yerleşik bir dönüştürme yoktur . Bununla birlikte, bu amaç için kolayca birkaç işlev yazabilirsiniz - örneğin, uicolor bileşenlerine erişen iphone geliştirmeye bakın


3
+1 Aşağı kaydırırsanız, söz konusu yöntem + colorWithHexString: yöntemidir.
Rob Napier

1
@RobNapier +colorWithHexString:çalışmıyor. En azından benim durumumda. :)
पवन

15

Bunun için iyi bir UIColorkategori buldum , UIColor + PXExtensions .

Kullanımı: UIColor *mycolor = [UIColor pxColorWithHexValue:@"#BADA55"];

Ve benim özümün bağlantısının başarısız olması durumunda, gerçek uygulama kodu şöyledir:

//
//  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 tamam, uygulama kodunu ekledim :)
Hlung

13

hızlı sürüm. İşlev veya Uzantı olarak kullanın.

fonksiyon
  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))
}
Uzantı
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))
    }
}
Nasıl aranır
let hexColorFromFunction = UIColorFromRGB("F4C124", alpha: 1.0)
let hexColorFromExtension = UIColor(colorCode: "F4C124", alpha: 1.0)
Ayrıca Hex Colorarayüz oluşturucunuzdan da tanımlayabilirsiniz .

resim açıklamasını buraya girin


12

Bu başka bir alternatif.

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

alternatif bir soruya alternatif cevap ... bu sayfadaki soruya makul bir cevap değil.
mah

11

HEX dizesini gerçek bir UIColor'a dönüştürmek için çeşitli çevrimiçi araçlar kullanabilirsiniz. Uicolor.org veya UI Renk Seçici'ye göz atın . Çıktı Objective-C koduna dönüştürülecektir, örneğin:

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

Hangi uygulama içine gömmek olabilir. Bu yardımcı olur umarım!


Başka bir çevrimiçi araç, aslında aynı isim, UI Renk Seçici .
Joe

Genellikle insanlar böyle oldukça basit bir sorunu çözmek için kodla ilgili yardım istediklerinde, "önce bazı çevrimiçi sitelere git ..." yazan bir cevap, askerin istediği cevap olmaktan bile uzak değildir.
mah

11

SWIFT 4

Uzantıda şöyle güzel bir conveniencekurucu oluşturabilirsiniz :

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

Ve daha sonra şöyle kullanın

let color = UIColor(hexString: "#AABBCCDD")

'scanHexInt32' iOS 13.0'da kullanımdan kaldırıldı
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)}
}

Kullanımı:

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

Bu cocoapod desteği ile güzel

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]

Güzel şeyler kardeşim :)
cesarferreira

4

Alfa içeren başka bir sürüm

#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

Şeffaflığı desteklemek için RGBA Int değeri almasına rağmen @ Tom'un cevabının hızlı karşılığı:

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)

Ve dizeden kullanmak istiyorsanız strtoul'u kullanabilirsiniz:

var hexString = "0x7F00FFFF"

let num = strtoul(hexString, nil, 16)

var colorFromString = colorWithHex(num)

4

İşte Swift 1.2bir uzantısı olarak yazılmış bir sürüm UIColor. Bu,

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

Hissettiğim bunu yapmanın en doğal yolu.

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

Xcode 6.3.2 ile başlayan satırda let greenRange = ...bir istisna alıyorum:fatal error: can not increment endIndex
Clifton Labrum

@CliftonLabrum Bunu Xcode 7 beta 3'te test ettim ve aynı şekilde çalışıyor. Hala bu sorunu yaşıyor musunuz?
Morgan Wilde

3

"FFF"Veya gibi "FFFFFF"alpha dizelerine izin veren başka bir uygulama :

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

hızlı 1.2 için güncellendi

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

Aşağıdakiler için zarif bir uzantı oluşturun 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)
    }
}

Kırmızı renk oluştur:

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

u bu kodu kullanmak istiyorsanız, u [self getUIColorObjectFromHexString: @ "27b8c8" alfa: 9] çağırın; sadece ...
Manish Saini

2

Alfa'nın yanı sıra alfa olmasını da seviyorum, bu yüzden kendi kategorimi yazıyorum

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

böyle kullanımı kolay

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

2

Bunun için bir kolaylık başlangıcı oluşturdum:

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

projenizde herhangi bir yerde bir UIColor oluşturabilirsiniz:

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

Bu yardımcı olur umarım...


2

UIColor uzantı sınıfını şu şekilde oluşturabilirsiniz: -

uzantı UIColor {

// MARK: - getColorFromHex / ** Bu işlev Onaltılık renk kodunu RGB'ye dönüştürür.

- 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

Hızlı 2.0+ için. Bu kod benim için iyi çalışıyor.

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

Bu kod, dize biçimi kontrolünü içerir. Örneğin

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

Ve bildiğim kadarıyla, kodum başarısız durumun anlamını korumak ve isteğe bağlı bir değer döndürmek için dezavantaj yok. Ve bu en iyi cevap olmalı.


2

Renklerin alfa değerini ve mükemmel hata işlemeyi ele alacak çözümün Swift 2.0 sürümü burada:

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

kullanım

self.view.backgroundColor = UIColorWithHexString(@"#0F35C0");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.