How can I create a UIColor from a hex string?

后端 未结 30 1161
北恋
北恋 2020-11-22 16:53

How can I create a UIColor from a hexadecimal string format, such as #00FF00?

相关标签:
30条回答
  • 2020-11-22 17:31

    swift version. Use as a Function or an Extension.

    Function
      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))
    }
    
    Extension
    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))
        }
    }
    
    How to call
    let hexColorFromFunction = UIColorFromRGB("F4C124", alpha: 1.0)
    let hexColorFromExtension = UIColor(colorCode: "F4C124", alpha: 1.0)
    
    You can also define your Hex Color from interface builder.

    0 讨论(0)
  • 2020-11-22 17:31

    SWIFT 4

    You can create a nice convenience constructor in the extension like this:

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

    And use it later like

    let color = UIColor(hexString: "#AABBCCDD")
    
    0 讨论(0)
  • 2020-11-22 17:32

    Swift 2.0 version of solution which will handle alpha value of color and with perfect error handling is here:

    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
    }
    
    0 讨论(0)
  • 2020-11-22 17:33

    This is a function that takes a hex string and returns a UIColor.
    (You can enter hex strings with either format: #ffffff or ffffff)

    Usage:

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



    Source: arshad/gist:de147c42d7b3063ef7bc

    0 讨论(0)
  • 2020-11-22 17:33
    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)
    
    0 讨论(0)
  • 2020-11-22 17:33

    For swift 2.0+. This code works fine to me.

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

    This code includes string format checking. e.g.

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

    And as far as I know, my code is of no disadvantage for its maintaining the semantic of failible condition and returning an optional value. And this should be the best answer.

    0 讨论(0)
提交回复
热议问题