我该如何从十六进制字符串创建UIColor?

584

我该如何从十六进制字符串格式(例如#00FF00)创建一个UIColor呢?


Erica还为iOS和OSX开发了一个出色的颜色扩展类别 - Echilon
这是另一个库:https://github.com/burhanuddin353/TFTColor - Burhanuddin Sunelwala
50个回答

742

我发现最简单的方法是使用宏。只需将其包含在头文件中,就可以在整个项目中使用。

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

使用十六进制值创建UIColor宏

此代码还有格式化版本:

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

使用方法:

label.textColor = UIColorFromRGB(0xBC1128);

Swift:

->

Swift:

static func UIColorFromRGB(_ rgbValue: Int) -> UIColor! {
    return UIColor(
        red: CGFloat((Float((rgbValue & 0xff0000) >> 16)) / 255.0),
        green: CGFloat((Float((rgbValue & 0x00ff00) >> 8)) / 255.0),
        blue: CGFloat((Float((rgbValue & 0x0000ff) >> 0)) / 255.0),
        alpha: 1.0)
}

144
这很棒,但它并没有满足提问者的要求,即将一个十六进制字符串转换为UIColor。这将一个整数转换为UIColor。 - darrinm
33
这是一个返回UIColor的例子,它从一个十六进制格式的整数(0x…)返回,而不是一个十六进制格式的字符串(“#…”)。如果这正是你想要的,那很棒,但这并不是提问者所询问的内容。 - darrinm
3
你的代码将一个以"#"为前缀的十六进制格式字符串转换为另一种以"0x"为前缀的十六进制格式字符串,但它并不生成整数。 - darrinm
1
如何像使用[UIColor whiteColor].CGColor一样使用它? - SleepNot
4
要将十六进制格式的字符串转换为整数以便与此宏一起使用,请参阅https://dev59.com/NXA65IYBdhLWcg3wxBir。 - devios1
显示剩余6条评论

390

一个简洁的解决方案:

// 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
一个很好的方法来进行反向转换(比如,如果你正在将颜色存储在核心数据/远程数据库中)可以在这里找到 - https://dev59.com/EGct5IYBdhLWcg3wsfkZ - Eric G
1
完美的解决方案。如果您的十六进制字符串来自于一个(非常不好文档化的)API,请务必针对类似于#FFF或#FC0的简写十六进制代码进行测试。 您需要将它们更改为#FFFFFF /#FFCCOO。 - Patrick
10
您可能还想在setScanLocation之前添加if ([hexString rangeOfString:@"#"].location == 0)代码,以使#变成可选项。 - devios1
11
懒人专用:SWIFT版本在这里 - fabian789
[scanner setScanLocation:[hexString rangeOfString:@"#"].location+1]; - k06a
显示剩余2条评论

204

我有一个解决方案,它与Android使用的十六进制格式字符串完全兼容,在进行跨平台移动开发时非常有用。这使我可以为两个平台使用相同的颜色调色板。如果您愿意,可以在不署名的情况下重复使用,或者根据Apache许可证使用。

#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 

Swift:

extension UIColor {
    convenience init?(hexString: String?) {
        let input: String! = (hexString ?? "")
            .replacingOccurrences(of: "#", with: "")
            .uppercased()
        var alpha: CGFloat = 1.0
        var red: CGFloat = 0
        var blue: CGFloat = 0
        var green: CGFloat = 0
        switch (input.count) {
        case 3 /* #RGB */:
            red = Self.colorComponent(from: input, start: 0, length: 1)
            green = Self.colorComponent(from: input, start: 1, length: 1)
            blue = Self.colorComponent(from: input, start: 2, length: 1)
            break
        case 4 /* #ARGB */:
            alpha = Self.colorComponent(from: input, start: 0, length: 1)
            red = Self.colorComponent(from: input, start: 1, length: 1)
            green = Self.colorComponent(from: input, start: 2, length: 1)
            blue = Self.colorComponent(from: input, start: 3, length: 1)
            break
        case 6 /* #RRGGBB */:
            red = Self.colorComponent(from: input, start: 0, length: 2)
            green = Self.colorComponent(from: input, start: 2, length: 2)
            blue = Self.colorComponent(from: input, start: 4, length: 2)
            break
        case 8 /* #AARRGGBB */:
            alpha = Self.colorComponent(from: input, start: 0, length: 2)
            red = Self.colorComponent(from: input, start: 2, length: 2)
            green = Self.colorComponent(from: input, start: 4, length: 2)
            blue = Self.colorComponent(from: input, start: 6, length: 2)
            break
        default:
            NSException.raise(NSExceptionName("Invalid color value"), format: "Color value \"%@\" is invalid.  It should be a hex value of the form #RBG, #ARGB, #RRGGBB, or #AARRGGBB", arguments:getVaList([hexString ?? ""]))
        }
        self.init(red: red, green: green, blue: blue, alpha: alpha)
    }
    
    static func colorComponent(from string: String!, start: Int, length: Int) -> CGFloat {
        let substring = (string as NSString)
            .substring(with: NSRange(location: start, length: length))
        let fullHex = length == 2 ? substring : "\(substring)\(substring)"
        var hexComponent: UInt64 = 0
        Scanner(string: fullHex)
            .scanHexInt64(&hexComponent)
        return CGFloat(Double(hexComponent) / 255.0)
    }
}

3
colorComponentFrom:start:length:方法中,你应该使用return hexComponent / 0xFF; // divide by 255, not 256而不是除以256。最大的十六进制值为0xFF,因此你应该除以0xFF(255)。 - Sam
6
太好了,干杯。另外,您可以在NSString上创建一个类别,以便使用语法[@"#538aa4" toColor] - Dan2552
2
这个解决方案很好,我建议在私有接口的名称前添加“Private”以避免编译器警告。@interface UIColor(Private) - djleop
不错的解决方案。但是在我看来,它还应该能够处理hexString=nil并返回黑色。 - Roland Keesom
1
不错。不过你应该把其他函数放在接口中。 - Bjorn Roche
显示剩余3条评论

72

有一篇关于如何解决提取UIColor从十六进制字符串的问题的好文章。下面所介绍的解决方案与其他方案不同之处在于它支持包括'0x'或'#'前缀的字符串值作为十六进制字符串表示形式...(请参见用法)

下面是主要内容...

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

辅助方法...

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

使用方法:

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

完整的参考文章

Swift 2+

我已经将这个解决方案移植到Swift 2.2。请注意,我已将alpha参数更改为默认设置为1.0。我还根据Swift 2.2中NSScanner类所需的要求更新了int类型为UInt32

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+

使用相同的逻辑,但应用了针对 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
}

Swift 5(iOS 13)+

以下是一个更新,适用于SDK废弃了scanHexInt32。我已经将代码封装到了Swift playground文件中。

//: A UIKit based Playground for presenting user interface
  
import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {
    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white

        let label = UILabel()
        label.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
        label.text = "Hello World!"
        label.textColor = colorWithHexString(hexString: "22F728")
        
        view.addSubview(label)
        self.view = view
    }
    
    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
        hexInt = UInt32(bitPattern: scanner.scanInt32(representation: .hexadecimal) ?? 0)
        return hexInt
    }
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()

颜色十六进制参考

HTML 颜色名称和代码

颜色十六进制颜色代码


这里发布的 Swift 代码片段似乎误解了 Swift 中可选项的目的,它是用来包含可能永远不存在的值的。需要问的问题是一个参数是否需要是可选项,是否可能需要将其设置为 nil。alpha 是否可能被设置为 nil 呢?因为这个方法给了人们这种能力,如果有人决定将 alpha 设置为 nil,那么对该可选项进行强制解包将不可避免地导致崩溃。我没有将其删除,但假如有些我不知道的理由请告诉我。 - Jonathan Thornton
@JonathanThornton - 感谢您的提醒。问题已解决。 - Tommie C.
正在处理一个遗留项目,Objective-C的解决方案非常好...除了...奇怪的是... @"#ffc107" 和 @"#e040fb" 不合作!有什么想法吗? - Nathaniel
"scanHexInt32" 在 macOS 10.15 中已被弃用。 - Sentry.co
1
@Sentry.co - 更新了代码以处理已弃用的方法。 - Tommie C.
@Nathaniel - 尝试了最新的代码并使用这两个颜色值,它们似乎按计划工作。 - Tommie C.

54

这是一个函数,接受一个十六进制字符串并返回UIColor。
(您可以使用以下任一格式输入十六进制字符串:#ffffffffffff)

用法:

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



来源:arshad/gist:de147c42d7b3063ef7bc


我在SVG中看到过这样的情况,即十六进制字符串有一个由3个字符组成的小版本,例如#F0F。 - Glenn Howes
这是速记符号,其中“#F0F”等同于“#FF00FF”。编写一个检查速记符号并展开它的函数将非常简单。 - Ethan Strider

41

请使用此类别:

在文件UIColor+Hexadecimal.h中。

#import <UIKit/UIKit.h>

@interface UIColor(Hexadecimal)

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

@end

在文件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
在课堂上,您希望使用它:
#import "UIColor+Hexadecimal.h"

而且:

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

不进行阿尔法处理 - Ihor Klimov

34
你可以像这样制作一个扩展。
extension UIColor {
    convenience init(hex: UInt, alpha: CGFloat = 1) {
        self.init(
            red: CGFloat((hex & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((hex & 0x00FF00) >> 8) / 255.0,
            blue: CGFloat(hex & 0x0000FF) / 255.0,
            alpha: alpha
        )
    }
}

并且可以像这样在任何地方使用它

let color1 = UIColor(hex: 0xffffff)
let color2 = UIColor(hex: 0xffffff, alpha: 0.2)

死简单,绝对是我最喜欢的。 - theory
谢谢,这篇真的很棒,相比其他冗长的文字,它非常简洁! - OwlOCR
不错的函数,但它并没有以任何方式回答问题。 - mah
@mah 这正是我所思考的问题,如何从十六进制字符串创建一个 UIColor。 - Manu Gupta
@ManuGupta,你可能会注意到这个答案完全没有任何字符串处理。十六进制数不是十六进制字符串。问题明确说明了一个字符串,虽然它没有引号,但#00FF00显然是一个字符字符串。正如其他人所说,它简单而简洁。但如果它不涉及字符串,那么它不可能回答一个关于如何处理字符串的问题。 - mah

28
一个伟大的Swift实现(适用于Xcode 7),使用扩展从各种不同的答案和地方汇集而来。在最后还需要字符串扩展。
使用方法:
let hexColor = UIColor(hex: "#00FF00")

注意:我在标准的6位十六进制值的末尾添加了2个额外数字的选项,用于表示 Alpha 通道(传入值为00 - 99)。如果您不喜欢这个选项,可以将其删除。您也可以实现它以传入可选的 Alpha 参数。

扩展:

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

字符串扩展:
浮点数源码
下标源码

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

你是否也使用了String扩展来获取它的下标?例如https://dev59.com/wGAf5IYBdhLWcg3w9mts#24144365 - Craig Grummitt
你可能想要提一下这是一个字符串扩展。另外,你好像错过了字符串 floatValue 扩展:https://dev59.com/zmAf5IYBdhLWcg3w_Gyr#24088249 除此之外,干得好! - Craig Grummitt
countElements() 函数在哪里? - Ε Г И І И О
在Swift 1.2中,countElements()count()替换了,它已经内置于语言中。我更新了我的答案以反映这一点。 - Firo
你知道吗?你的代码里有一个bug!在第一行注释和下一行中,你应该将#GGRRBBAA替换为#RRGGBBAA,不是吗?;-) - duthen
显示剩余2条评论

26

3
+1 如果您向下滚动,所涉及的方法是 +colorWithHexString:。 - Rob Napier
1
@RobNapier +colorWithHexString: 不起作用。至少在我的情况下是这样的。 :) - Pawan Sharma

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

使用方法:

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

另一种选择是将十六进制值转换为无符号整数,并从中提取相应的值:

extension UIColor {
    convenience init(hexaString: String, alpha: CGFloat = 1) {
        self.init(hexa: UInt(hexaString.dropFirst(), radix: 16) ?? 0, alpha: alpha)
    }
    convenience init(hexa: UInt, alpha: CGFloat = 1) {
        self.init(red:   .init((hexa & 0xff0000) >> 16) / 255,
                  green: .init((hexa & 0xff00  ) >>  8) / 255,
                  blue:  .init( hexa & 0xff    )        / 255,
                  alpha: alpha)
    }
}

let purpleColor       = UIColor(hexaString: "#FF00FF")    // r 1,0 g 0,0 b 1,0 a 1,0
let transparentYellow = UIColor(hexaString: "#FFFF00", alpha: 0.5)  // r 1,0 g 1,0 b 0,0 a 0,5

1
有史以来最好的简短解决方案 - Guilherme Golfetto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接