Làm cách nào để tạo UIColor từ chuỗi hex?


Câu trả lời:


722

Tôi đã tìm thấy cách đơn giản nhất để làm điều này là với một macro. Chỉ cần đưa nó vào tiêu đề của bạn và nó có sẵn trong suốt dự án của bạn.

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

macro màu sắc với các giá trị hex

Cũng định dạng phiên bản của mã này:

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

Sử dụng:

label.textColor = UIColorFromRGB(0xBC1128);

130
Điều này thật tuyệt vời ngoại trừ việc nó không làm những gì người hỏi yêu cầu, đó là chuyển đổi một chuỗi hexING thành UIColor. Điều này chuyển đổi một số nguyên thành một UIColor.
darrinm

31
@ MohamedA.Karim Đó là một ví dụ về việc trả lại UIColor từ số nguyên định dạng hex (0x ...) không phải là chuỗi định dạng hex ("# ..."). Tuyệt vời nếu đó là những gì bạn muốn, nhưng không phải những gì người hỏi yêu cầu.
darrinm

3
@ScottKohlert Dòng mã của bạn chuyển đổi một chuỗi định dạng hex (có tiền tố là "#") thành một chuỗi định dạng hex khác (có tiền tố là "0x"). Nó không tạo ra một số nguyên.
darrinm

1
Làm thế nào để sử dụng cái này như [UIColor whiteColor] .CGColor?
Ngủ

3
Để chuyển đổi một chuỗi định dạng hex thành một số nguyên để sử dụng với macro này, hãy xem stackoverflow.com/questions/3648411/ .
devios1

371

Một giải pháp ngắn gọn:

// 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
Và một phương pháp tốt để thực hiện chuyển đổi ngược lại (như nếu bạn đang lưu trữ màu sắc trong dữ liệu cốt lõi / cơ sở dữ liệu từ xa) có thể được tìm thấy ở đây - stackoverflow.com/questions/11884227/ Lỗi
Eric Goldberg

1
Một giải pháp hoàn hảo. Nếu chuỗi hex của bạn đến từ API (tài liệu rất kém), hãy chắc chắn kiểm tra các mã hex tốc ký như #FFF hoặc # FC0. Bạn sẽ cần thay đổi chúng thành # FFFFFF / # FFCCOO.
Patrick

10
Bạn cũng có thể muốn thêm if ( [hexString rangeOfString:@"#"].location == 0 )trước setScanLocationdòng để tạo #tùy chọn.
devios1

bạn có thể vui lòng thêm phương pháp ngược lại
hasan

11
Dành cho người lười biếng: phiên bản SWIFT tại đây .
fabian789

188

Tôi đã có một giải pháp tương thích 100% với các chuỗi định dạng hex được sử dụng bởi Android, điều mà tôi thấy rất hữu ích khi thực hiện phát triển di động đa nền tảng. Nó cho phép tôi sử dụng một vòm miệng màu cho cả hai nền tảng. Vui lòng sử dụng lại mà không cần ghi công hoặc theo giấy phép Apache nếu bạn thích.

#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
trong colorComponentFrom:start:length:, bạn không nên có return hexComponent / 0xFF; // divide by 255, not 256? Giá trị hex lớn nhất bạn nên nhận lại là 0xFF, do đó, đó là giá trị bạn nên chia cho 0xFF (255).
Sam

Bắt Sam tốt. Chỉnh sửa để phản ánh sự thay đổi.
Micah Hainline

6
Điều này thật tuyệt, chúc mừng. Ngoài ra, thay vì một danh mục trên UIColor, bạn có thể tạo một danh mục trên NSString để có thể có cú pháp như[@"#538aa4" toColor]
Dan2552

2
Giải pháp này rất hay, tôi khuyên bạn nên thêm "Riêng tư" cho tên của giao diện riêng để tránh cảnh báo của trình biên dịch. @interface UIColor (Riêng tư)
djleop

1
Đẹp. Bạn nên đặt các chức năng khác trong giao diện, mặc dù.
Bjorn Roche

63

Có một bài viết hay về cách giải quyết câu hỏi của OP về việc trích xuất UIColortừ một chuỗi hex. Giải pháp được trình bày dưới đây khác với các giải pháp khác vì nó hỗ trợ các giá trị chuỗi có thể bao gồm '0x' hoặc '#' có tiền tố đại diện cho chuỗi hex ... (xem cách sử dụng)

Đây là bit chính ...

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

Phương pháp trợ giúp ...

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

Sử dụng:

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

Hoàn thành bài viết tham khảo

Swift 2+

Tôi đã chuyển giải pháp này sang Swift 2.2. Lưu ý rằng tôi đã thay đổi alphatham số để sử dụng cài đặt mặc định thành 1.0. Tôi cũng đã cập nhật kiểu int thành UInt32theo yêu cầu của NSScannerlớp trong 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+

Sử dụng cùng logic với các thay đổi được áp dụng cho 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
}

Tài liệu tham khảo màu Hex

Tên và mã màu HTML

Mã màu Hex màu


Đoạn trích Swift được đăng ở đây dường như hiểu sai mục đích của các tùy chọn trong Swift, đó là chứa các giá trị không bao giờ tồn tại. Câu hỏi đặt ra là liệu một tham số có cần phải là tùy chọn hay không là liệu ai đó có thể cần khả năng đặt nó thành không. Liệu nó có thể có ý nghĩa cho alphađến bao giờ được đặt thành không? Bởi vì phương pháp này mang lại cho mọi người khả năng đó và nếu ai đó quyết định đặt alphathành con số không, việc buộc phải hủy bỏ tùy chọn đó sẽ luôn dẫn đến một sự cố. Tôi đã không chỉnh sửa nó, mặc dù, trong trường hợp có một số biện minh mà tôi không biết.
Jonathan Thornton

@JonathanThornton - Cảm ơn vì đã ngẩng cao đầu. Đã giải quyết.
Tommie C.

Làm việc trên một dự án cũ và giải pháp Objective-C hoạt động rất tốt ... ngoại trừ ... kỳ quặc ... @ "# ffc107" và @ "# e040fb" từ chối hợp tác! Suy nghĩ?
Nathaniel

51

Đây là một hàm lấy một chuỗi hex và trả về một UIColor.
(Bạn có thể nhập chuỗi hex với định dạng: #ffffffhoặc ffffff)

Sử dụng:

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



Nguồn: arshad / ý chính: de147c42d7b3063ef7bc


Tôi đã thấy trong SVG, nơi có một phiên bản nhỏ của chuỗi hex có 3 ký tự, như # F0F.
Glenn Howes

Đó là ký hiệu viết tắt, trong đó '# F0F' tương đương với '# FF00FF'. Sẽ thật đơn giản để viết một hàm kiểm tra tốc ký và mở rộng nó.
Ethan Strider

38

Sử dụng Danh mục này:

trong tệp UIColor + Hexadecimal.h

#import <UIKit/UIKit.h>

@interface UIColor(Hexadecimal)

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

@end

trong tệp 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

Trong lớp bạn muốn sử dụng nó:

#import "UIColor+Hexadecimal.h"

và:

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

Không xử lý alpha
Ihor Klimov

28

Một triển khai Swift tuyệt vời (được cập nhật cho Xcode 7) bằng cách sử dụng các tiện ích mở rộng, được kết hợp từ nhiều câu trả lời và địa điểm khác nhau. Bạn cũng sẽ cần các phần mở rộng chuỗi ở cuối.

Sử dụng:

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

LƯU Ý: Tôi đã thêm một tùy chọn cho 2 chữ số bổ sung vào cuối giá trị hex 6 chữ số tiêu chuẩn cho kênh alpha (vượt qua giá trị của 00- 99). Nếu điều này xúc phạm bạn, chỉ cần loại bỏ nó. Bạn có thể thực hiện nó để vượt qua trong một tham số alpha tùy chọn.

Sự mở rộng:

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

Chuỗi mở rộng:
Nguồn nổi Nguồn
đăng ký

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

Bạn cũng đang sử dụng một phần mở rộng Chuỗi để có được chỉ mục của nó? ví dụ: stackoverflow.com/a/24144365/3220708
Craig Grummitt

@CraigGrummitt ơi! Haha vâng. Tôi có một danh sách tổng hợp đầy đủ các phần mở rộng và đăng ký mà đôi khi tôi (đáng buồn) quên những gì và không được bao gồm trong bộ tính năng ngôn ngữ tiêu chuẩn. Tôi đã cập nhật câu trả lời của tôi bao gồm cả nguồn bạn đưa ra. Không chắc tôi có lấy nó từ đó không nhưng nó chắc chắn trông rất gần.
Firo

Bạn có thể muốn đề cập rằng đó là một phần mở rộng Chuỗi. Ngoài ra, bạn dường như đã bỏ lỡ tiện ích mở rộng String floatValue: stackoverflow.com/a/24088249/3220708 Khác với điều đó, làm tốt lắm!
Craig Grummitt

Trường hợp CountElements () func ở đâu?
Ε é И

countElements()đã được thay thế bằng count()Swift 1.2, nó được tích hợp vào ngôn ngữ. Tôi cập nhật câu trả lời của tôi để phản ánh điều đó.
Firo

27

Bạn có thể tạo một phần mở rộng như thế này

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

Và sử dụng nó ở bất cứ đâu như thế này

UIColor(rgb: 0xffffff, alphaVal: 0.2)

Chết đơn giản, chắc chắn là yêu thích của tôi.
lý thuyết

Cảm ơn, cái này là tuyệt vời, rất súc tích so với các bức tường văn bản khác!
FrankByte.com

chức năng tốt đẹp nhưng nó không trả lời câu hỏi.
mah

@mah Đây chính xác là câu hỏi tôi nghĩ, làm thế nào để tạo UIColor từ hình lục giác
Manu Gupta

@ManuGupta bạn có thể nhận thấy thiếu hoàn toàn bất kỳ xử lý chuỗi nào trong câu trả lời này. Số hex không phải là chuỗi hex. Câu hỏi nêu rõ một chuỗi và mặc dù nó không có dấu ngoặc kép trong đó, #00FF00rõ ràng được dự định là một chuỗi ký tự. Như những người khác đã nói nó đơn giản, súc tích. Nhưng nếu nó không xử lý chuỗi, nó không thể trả lời câu hỏi làm thế nào để xử lý chuỗi.
mah

26

Không có chuyển đổi dựng sẵn từ chuỗi thập lục phân sang UIColor(hoặc CGColor) mà tôi biết. Tuy nhiên, bạn có thể dễ dàng viết một vài chức năng cho mục đích này - ví dụ: xem phát triển iphone truy cập các thành phần u màu


3
+1 Nếu bạn cuộn xuống, phương thức được đề cập là + colorWithHexString :.
Rob Napier

1
@RobNapier +colorWithHexString:không hoạt động. Ít nhất là trong trường hợp của tôi. :)

15

Tôi tìm thấy một UIColordanh mục tốt cho việc này, UIColor + PXExtensions .

Sử dụng: UIColor *mycolor = [UIColor pxColorWithHexValue:@"#BADA55"];

Và, chỉ trong trường hợp liên kết đến ý chính của tôi không thành công, đây là mã triển khai thực tế:

//
//  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, tôi đã thêm mã thực hiện :)
Hlung

13

phiên bản nhanh chóng. Sử dụng như một chức năng hoặc một phần mở rộng.

Chức năng
  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))
}
Sự mở rộng
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))
    }
}
Cách gọi
let hexColorFromFunction = UIColorFromRGB("F4C124", alpha: 1.0)
let hexColorFromExtension = UIColor(colorCode: "F4C124", alpha: 1.0)
Bạn cũng có thể xác định Hex Colortừ trình xây dựng giao diện.

nhập mô tả hình ảnh ở đây


12

Đây là một thay thế khác.

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

câu trả lời thay thế cho một câu hỏi thay thế ... mặc dù không phải là một câu trả lời hợp lý cho câu hỏi trên trang này.
mah

11

Bạn có thể sử dụng các công cụ trực tuyến khác nhau để chuyển đổi chuỗi HEX thành UIColor thực tế. Kiểm tra ucolor.org hoặc Bộ chọn màu UI . Đầu ra sẽ được chuyển đổi thành mã Objective-C, như:

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

Mà bạn có thể nhúng vào ứng dụng của bạn. Hi vọng điêu nay co ich!


Một công cụ trực tuyến khác, cùng tên trên thực tế, UI Color Picker .
Joe

Nói chung khi mọi người yêu cầu trợ giúp về mã để giải quyết một vấn đề khá đơn giản như thế này, một câu trả lời có nội dung "trước tiên hãy truy cập một số trang web trực tuyến ..." thực sự thậm chí không gần với câu trả lời mà người hỏi muốn.
mah

11

Chuyển 4

Bạn có thể tạo một hàm tạo đẹp conveniencetrong phần mở rộng như thế này:

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

Và sử dụng nó sau này như thế nào

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

'scanHexInt32' không được dùng nữa trong 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)}
}

Sử dụng:

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

Điều này thật tuyệt với sự hỗ trợ của 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]

Đẹp thứ bro :)
Caesarferreira 7/07/14

4

Một phiên bản khác với 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

Swift tương đương với câu trả lời của @ Tom, mặc dù nhận giá trị RGBA Int để hỗ trợ độ trong suốt:

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)

Và nếu bạn muốn có thể sử dụng nó từ chuỗi, bạn có thể sử dụng strtoul:

var hexString = "0x7F00FFFF"

let num = strtoul(hexString, nil, 16)

var colorFromString = colorWithHex(num)

4

Đây là một Swift 1.2phiên bản được viết dưới dạng phần mở rộng UIColor. Điều này cho phép bạn làm

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

Mà tôi cảm thấy là cách tự nhiên nhất để làm điều đó.

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

Trong Xcode 6.3.2 trên dòng bắt đầu bằng let greenRange = ...tôi có một ngoại lệ:fatal error: can not increment endIndex
Clifton Labrum

@CliftonLabrum Tôi đã thử nghiệm điều này trên Xcode 7 beta 3 và nó hoạt động tương tự. Bạn vẫn còn gặp phải vấn đề này chứ?
Morgan Wilde

3

Một triển khai khác cho phép các chuỗi như "FFF"hoặc "FFFFFF"và sử dụng 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

cập nhật cho swift 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

Tạo phần mở rộng thanh lịch cho 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)
    }
}

Tạo màu đỏ:

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

nếu bạn muốn sử dụng mã này, thì bạn gọi [self getUIColorObjectFromHexString: @ "27b8c8" alpha: 9]; chỉ ....
Manish Saini

2

Tôi thích đảm bảo alpha bên cạnh màu sắc, vì vậy tôi viết danh mục của riêng tôi

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

dễ sử dụng như thế này

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

2

Tôi đã tạo một init tiện lợi cho điều đó:

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

sau đó bạn có thể tạo một UIColor ở bất cứ đâu trong dự án của bạn như thế này:

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

hi vọng điêu nay co ich...


2

Bạn có thể tạo lớp mở rộng của UIColor như: -

tiện ích mở rộng UIColor {

// Đánh dấu: - getColorFromHex / ** Hàm này sẽ chuyển đổi mã Hex màu thành 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

Đối với nhanh hơn 2.0+. Mã này hoạt động tốt với tôi.

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

Mã này bao gồm kiểm tra định dạng chuỗi. ví dụ

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

Và theo như tôi biết, mã của tôi không có bất lợi cho việc duy trì ngữ nghĩa của điều kiện không thể và trả về một giá trị tùy chọn. Và đây nên là câu trả lời tốt nhất.


2

Phiên bản Swift 2.0 của giải pháp sẽ xử lý giá trị alpha của màu sắc và xử lý lỗi hoàn hảo có tại đây:

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

Sử dụng

self.view.backgroundColor = UIColorWithHexString(@"#0F35C0");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.