30 ответов:
#ffffffна самом деле 3 цветовых компонента в шестнадцатеричной нотации - красныйff, зеленыйffи синийff. Вы можете написать шестнадцатеричную нотацию в Swift с помощью0xпрефикс, например0xFFчтобы упростить преобразование, давайте создадим инициализатор, который принимает целочисленные (0 - 255) значения:
extension UIColor { convenience init(red: Int, green: Int, blue: Int) { assert(red >= 0 && red <= 255, "Invalid red component") assert(green >= 0 && green <= 255, "Invalid green component") assert(blue >= 0 && blue <= 255, "Invalid blue component") self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1.0) } convenience init(rgb: Int) { self.init( red: (rgb >> 16) & 0xFF, green: (rgb >> 8) & 0xFF, blue: rgb & 0xFF ) } }использование:
let color = UIColor(red: 0xFF, green: 0xFF, blue: 0xFF) let color2 = UIColor(rgb: 0xFFFFFF)как получить Альфа?
в зависимости от вашего варианта использования, вы можете просто использовать родной
UIColor.withAlphaComponentспособ, например,let semitransparentBlack = UIColor(rgb: 0x000000).withAlphaComponent(0.5)или вы можете добавить дополнительный (необязательный) параметр перечисленных выше методов:
convenience init(red: Int, green: Int, blue: Int, a: CGFloat = 1.0) { self.init( red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: a ) } convenience init(rgb: Int, a: CGFloat = 1.0) { self.init( red: (rgb >> 16) & 0xFF, green: (rgb >> 8) & 0xFF, blue: rgb & 0xFF, a: a ) }(мы не можем назвать параметр
alphaиз-за столкновения имени с существующим инициализатором).называют:
let color = UIColor(red: 0xFF, green: 0xFF, blue: 0xFF, a: 0.5) let color2 = UIColor(rgb: 0xFFFFFF, a: 0.5)чтобы получить Альфа в виде целого числа 0-255, мы можем
convenience init(red: Int, green: Int, blue: Int, a: Int = 0xFF) { self.init( red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: CGFloat(a) / 255.0 ) } // let's suppose alpha is the first component (ARGB) convenience init(argb: Int) { self.init( red: (argb >> 16) & 0xFF, green: (argb >> 8) & 0xFF, blue: argb & 0xFF, a: (argb >> 24) & 0xFF ) }называют
let color = UIColor(red: 0xFF, green: 0xFF, blue: 0xFF, a: 0xFF) let color2 = UIColor(argb: 0xFFFFFFFF)или сочетание предыдущих методов. Нет абсолютно никакой необходимости используйте строки.
это функция, которая принимает шестнадцатеричную строку и возвращает UIColor.
(вы можете ввести шестнадцатеричные строки в любом формате:#ffffffилиffffff)использование:
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
редактировать: обновлен код. Спасибо, Hlung, jaytrixz и Ahmad F!
Swift 4 расширение UIColor:
extension UIColor { convenience init(hexString: String) { let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) var int = UInt32() Scanner(string: hex).scanHexInt32(&int) let a, r, g, b: UInt32 switch hex.count { case 3: // RGB (12-bit) (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) case 6: // RGB (24-bit) (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) case 8: // ARGB (32-bit) (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) default: (a, r, g, b) = (255, 0, 0, 0) } self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255) } }использование:
let darkGrey = UIColor(hexString: "#757575")Swift 2.x версия:
extension UIColor { convenience init(hexString: String) { let hex = hexString.stringByTrimmingCharactersInSet(NSCharacterSet.alphanumericCharacterSet().invertedSet) var int = UInt32() NSScanner(string: hex).scanHexInt(&int) let a, r, g, b: UInt32 switch hex.characters.count { case 3: // RGB (12-bit) (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) case 6: // RGB (24-bit) (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) case 8: // ARGB (32-bit) (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) default: (a, r, g, b) = (255, 0, 0, 0) } self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255) } }
UIColor:extension UIColor { convenience init(hex: Int) { let components = ( R: CGFloat((hex >> 16) & 0xff) / 255, G: CGFloat((hex >> 08) & 0xff) / 255, B: CGFloat((hex >> 00) & 0xff) / 255 ) self.init(red: components.R, green: components.G, blue: components.B, alpha: 1) } }
CGColor:extension CGColor { class func colorWithHex(hex: Int) -> CGColorRef { return UIColor(hex: hex).CGColor } }
использование
let purple = UIColor(hex: 0xAB47BC)
С Swift 2.0 и Xcode 7.0.1 вы можете создать эту функцию:
// Creates a UIColor from a Hex string. func colorWithHexString (hex:String) -> UIColor { var cString:String = hex.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).uppercaseString if (cString.hasPrefix("#")) { cString = (cString as NSString).substringFromIndex(1) } if (cString.characters.count != 6) { return UIColor.grayColor() } let rString = (cString as NSString).substringToIndex(2) let gString = ((cString as NSString).substringFromIndex(2) as NSString).substringToIndex(2) let bString = ((cString as NSString).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(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: CGFloat(1)) }и затем использовать его таким образом:
let color1 = colorWithHexString("#1F437C")Обновлено Для Swift 4
func colorWithHexString (hex:String) -> UIColor { var cString = hex.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).uppercased() if (cString.hasPrefix("#")) { cString = (cString as NSString).substring(from: 1) } if (cString.characters.count != 6) { return UIColor.gray } let rString = (cString as NSString).substring(to: 2) let gString = ((cString as NSString).substring(from: 2) as NSString).substring(to: 2) let bString = ((cString as NSString).substring(from: 4) as NSString).substring(to: 2) var r:CUnsignedInt = 0, g:CUnsignedInt = 0, b:CUnsignedInt = 0; Scanner(string: rString).scanHexInt32(&r) Scanner(string: gString).scanHexInt32(&g) Scanner(string: bString).scanHexInt32(&b) return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: CGFloat(1)) }
Swift 4 : совместив ответы Батери и лука Торелла :
extension UIColor { convenience init(hexFromString:String, alpha:CGFloat = 1.0) { var cString:String = hexFromString.trimmingCharacters(in: .whitespacesAndNewlines).uppercased() var rgbValue:UInt32 = 10066329 //color #999999 if string has wrong format if (cString.hasPrefix("#")) { cString.remove(at: cString.startIndex) } if ((cString.count) == 6) { Scanner(string: cString).scanHexInt32(&rgbValue) } self.init( red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0, green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0, blue: CGFloat(rgbValue & 0x0000FF) / 255.0, alpha: alpha ) } }примеры использования:
let myColor = UIColor(hexFromString: "4F9BF5") let myColor = UIColor(hexFromString: "#4F9BF5") let myColor = UIColor(hexFromString: "#4F9BF5", alpha: 0.5)
Swift 3: Hex и CSS поддержка имени цвета через UIColor
пример строки:
Orange,Lime,Tomatoи т. д.Clear,Transparent,nil, и выход пустой строки[UIColor clearColor]abcabc7#abc700FFFF#00FFFF00FFFF77детская площадка выход:
этой ответ показывает, как это сделать в Obj-C. мост должен использовать
let rgbValue = 0xFFEEDD let r = Float((rgbValue & 0xFF0000) >> 16)/255.0 let g = Float((rgbValue & 0xFF00) >> 8)/255.0 let b = Float((rgbValue & 0xFF))/255.0 self.backgroundColor = UIColor(red:r, green: g, blue: b, alpha: 1.0)
самый простой способ добавить цвет программно с помощью ColorLiteral.
просто добавьте свойство ColorLiteral как показано в Примере, Xcode предложит вам целый список цветов, которые вы можете выбрать. Преимуществом этого является меньший код, добавить шестнадцатеричные значения или RGB. Вы также получите недавно используемые цвета из раскадровки.
другой способ
Swift 3.0
написать расширение для UIColor
// To change the HexaDecimal value to Corresponding Color extension UIColor { class func uicolorFromHex(_ rgbValue:UInt32, alpha : CGFloat)->UIColor { let red = CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0 let green = CGFloat((rgbValue & 0xFF00) >> 8) / 255.0 let blue = CGFloat(rgbValue & 0xFF) / 255.0 return UIColor(red:red, green:green, blue:blue, alpha: alpha) } }вы можете напрямую создать UIColor с помощью hex, как это
let carrot = UIColor.uicolorFromHex(0xe67e22, alpha: 1))
последняя версия swift3
extension UIColor { convenience init(hexString: String) { let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) var int = UInt32() Scanner(string: hex).scanHexInt32(&int) let a, r, g, b: UInt32 switch hex.characters.count { case 3: // RGB (12-bit) (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) case 6: // RGB (24-bit) (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) case 8: // ARGB (32-bit) (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) default: (a, r, g, b) = (255, 0, 0, 0) } self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255) } }используйте в своем классе или где - либо вы преобразованы в hexcolor в uicolor, как таким образом
let color1 = UIColor(hexString: "#FF323232")
обновлено на 2018/06/14
образец должен работать на Swift2.2, Swift2. 3, Swift3, Swift4:
public extension UIColor { convenience init(hex: Int, alpha: Double = 1.0) { self.init(red: CGFloat((hex>>16)&0xFF)/255.0, green: CGFloat((hex>>8)&0xFF)/255.0, blue: CGFloat((hex)&0xFF)/255.0, alpha: CGFloat(255 * alpha) / 255) } convenience init(hexString: String, alpha: Double = 1.0) { let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) var int = UInt32() Scanner(string: hex).scanHexInt32(&int) let r, g, b: UInt32 switch hex.count { case 3: // RGB (12-bit) (r, g, b) = ((int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) case 6: // RGB (24-bit) (r, g, b) = (int >> 16, int >> 8 & 0xFF, int & 0xFF) default: (r, g, b) = (1, 1, 0) } self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(255 * alpha) / 255) } }используйте их, как показано ниже:
Ответ
Я сделал еще один
UIColor extensionв Swift 2.2 он может использовать шестнадцатеричное значение дляUIColorпрямо, желание может помочь кому-то:extension UIColor { convenience init(hex: Int, alpha: Double = 1.0) { self.init(red: CGFloat((hex>>16)&0xFF)/255.0, green:CGFloat((hex>>8)&0xFF)/255.0, blue: CGFloat((hex)&0xFF)/255.0, alpha: CGFloat(255 * alpha) / 255) } }и использовать его так:
UIColor(hex: 0xffffff) // r 1.0 g 1.0 b 1.0 a 1.0 UIColor(hex: 0xffffff, alpha: 0.5) // r 1.0 g 1.0 b 1.0 a 0.5
вот быстрое расширение на
UIColorэто принимает шестнадцатеричную строку:import UIKit extension UIColor { convenience init(hexString: String) { // Trim leading '#' if needed var cleanedHexString = hexString if hexString.hasPrefix("#") { // cleanedHexString = dropFirst(hexString) // Swift 1.2 cleanedHexString = String(hexString.characters.dropFirst()) // Swift 2 } // String -> UInt32 var rgbValue: UInt32 = 0 NSScanner(string: cleanedHexString).scanHexInt(&rgbValue) // UInt32 -> R,G,B let red = CGFloat((rgbValue >> 16) & 0xff) / 255.0 let green = CGFloat((rgbValue >> 08) & 0xff) / 255.0 let blue = CGFloat((rgbValue >> 00) & 0xff) / 255.0 self.init(red: red, green: green, blue: blue, alpha: 1.0) } }
public static 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) { 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) ) }else if ((cString.characters.count) == 8) { var rgbValue:UInt32 = 0 Scanner(string: cString).scanHexInt32(&rgbValue) return UIColor( red: CGFloat((rgbValue & 0x00FF0000) >> 16) / 255.0, green: CGFloat((rgbValue & 0x0000FF00) >> 8) / 255.0, blue: CGFloat(rgbValue & 0x000000FF) / 255.0, alpha: CGFloat((rgbValue & 0xFF000000) >> 24) / 255.0 ) }else{ return UIColor.gray } }как использовать
var color: UIColor = hexStringToUIColor(hex: "#00ff00"); // Without transparency var colorWithTransparency: UIColor = hexStringToUIColor(hex: "#dd00ff00"); // With transparency
Я объединил несколько идей из этого потока ответов и обновил его до Swift 4.
extension UIColor { convenience init(hex: String, alpha: CGFloat = 1.0) { var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased() if (cString.hasPrefix("#")) { cString.removeFirst() } if ((cString.count) != 6) { self.init(hex: "ff0000") // return red color for wrong hex input return } var rgbValue: UInt32 = 0 Scanner(string: cString).scanHexInt32(&rgbValue) self.init(red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0, green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0, blue: CGFloat(rgbValue & 0x0000FF) / 255.0, alpha: alpha) } }затем вы можете использовать его как это:
UIColor(hex: "#ff0000") // with # UIColor(hex: "ff0000") // without # UIColor(hex: "ff0000", alpha: 0.5) // using optional alpha value
на Swift 4 версия выглядит так:
extension UIColor { convenience init(hexString: String, alpha: CGFloat = 1.0) { let hexString: String = hexString.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) let scanner = Scanner(string: hexString) if (hexString.hasPrefix("#")) { scanner.scanLocation = 1 } var color: UInt32 = 0 scanner.scanHexInt32(&color) let mask = 0x000000FF let r = Int(color >> 16) & mask let g = Int(color >> 8) & mask let b = Int(color) & mask let red = CGFloat(r) / 255.0 let green = CGFloat(g) / 255.0 let blue = CGFloat(b) / 255.0 self.init(red:red, green:green, blue:blue, alpha:alpha) } func toHexString() -> String { var r:CGFloat = 0 var g:CGFloat = 0 var b:CGFloat = 0 var a:CGFloat = 0 getRed(&r, green: &g, blue: &b, alpha: &a) let rgb:Int = (Int)(r*255)<<16 | (Int)(g*255)<<8 | (Int)(b*255)<<0 return String(format:"#%06x", rgb) } }
поддерживая 7 типов цвета наговора
есть 7 шестигранные цветовых форматов: ""#число ff0000","значение 0xff0000", "число ff0000", "также F00", "красный", 0x00ff00 для , 16711935
NSColorParser.nsColor("#FF0000",1)//red nsColor NSColorParser.nsColor("FF0",1)//red nsColor NSColorParser.nsColor("0xFF0000",1)//red nsColor NSColorParser.nsColor("#FF0000",1)//red nsColor NSColorParser.nsColor("FF0000",1)//red nsColor NSColorParser.nsColor(0xFF0000,1)//red nsColor NSColorParser.nsColor(16711935,1)//red nsColorвнимание: это не "один файл-решение", есть некоторые зависимости, но охота на них может быть быстрее, чем исследовать это с нуля.
Permalink:
https://github.com/eonist/Element/wiki/Progress#supporting-7-hex-color-types
Swift 2.0
приведенный ниже код тестируется на xcode 7.2
import UIKit extension UIColor{ public convenience init?(colorCodeInHex: String, alpha: Float = 1.0){ var filterColorCode:String = colorCodeInHex.stringByReplacingOccurrencesOfString("#", withString: "") if filterColorCode.characters.count != 6 { self.init(red: 0.0, green: 0.0, blue: 0.0, alpha: CGFloat(alpha)) return } filterColorCode = filterColorCode.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).uppercaseString var range = Range(start: filterColorCode.startIndex.advancedBy(0), end: filterColorCode.startIndex.advancedBy(2)) let rString = filterColorCode.substringWithRange(range) range = Range(start: filterColorCode.startIndex.advancedBy(2), end: filterColorCode.startIndex.advancedBy(4)) let gString = filterColorCode.substringWithRange(range) range = Range(start: filterColorCode.startIndex.advancedBy(4), end: filterColorCode.startIndex.advancedBy(6)) let bString = filterColorCode.substringWithRange(range) 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) self.init(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: CGFloat(alpha)) return } }
Swift 2.0:
сделать расширение UIColor.
extension UIColor { convenience init(hexString:String) { let hexString:NSString = hexString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) let scanner = NSScanner(string: hexString as String) if (hexString.hasPrefix("#")) { scanner.scanLocation = 1 } var color:UInt32 = 0 scanner.scanHexInt(&color) let mask = 0x000000FF let r = Int(color >> 16) & mask let g = Int(color >> 8) & mask let b = Int(color) & mask let red = CGFloat(r) / 255.0 let green = CGFloat(g) / 255.0 let blue = CGFloat(b) / 255.0 self.init(red:red, green:green, blue:blue, alpha:1) } func toHexString() -> String { var r:CGFloat = 0 var g:CGFloat = 0 var b:CGFloat = 0 var a:CGFloat = 0 getRed(&r, green: &g, blue: &b, alpha: &a) let rgb:Int = (Int)(r*255)<<16 | (Int)(g*255)<<8 | (Int)(b*255)<<0 return NSString(format:"#%06x", rgb) as String } }использование:
//Hex to Color let countPartColor = UIColor(hexString: "E43038") //Color to Hex let colorHexString = UIColor(red: 228, green: 48, blue: 56, alpha: 1.0).toHexString()
Swift 2.0:
В метод viewDidLoad()
var viewColor:UIColor viewColor = UIColor() let colorInt:UInt colorInt = 0x000000 viewColor = UIColorFromRGB(colorInt) self.View.backgroundColor=viewColor func UIColorFromRGB(rgbValue: UInt) -> UIColor { 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
extension String { var hexColor: UIColor { let hex = trimmingCharacters(in: CharacterSet.alphanumerics.inverted) var int = UInt32() Scanner(string: hex).scanHexInt32(&int) let a, r, g, b: UInt32 switch hex.characters.count { case 3: // RGB (12-bit) (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) case 6: // RGB (24-bit) (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) case 8: // ARGB (32-bit) (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) default: return .clear } return UIColor(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255) } }
вы можете использовать это расширение для UIColor , которое преобразует вашу строку (шестнадцатеричную, RGBA) в UIColor и наоборот.
extension UIColor { //Convert RGBA String to UIColor object //"rgbaString" must be separated by space "0.5 0.6 0.7 1.0" 50% of Red 60% of Green 70% of Blue Alpha 100% public convenience init?(rgbaString : String){ self.init(ciColor: CIColor(string: rgbaString)) } //Convert UIColor to RGBA String func toRGBAString()-> String { var r: CGFloat = 0 var g: CGFloat = 0 var b: CGFloat = 0 var a: CGFloat = 0 self.getRed(&r, green: &g, blue: &b, alpha: &a) return "\(r) \(g) \(b) \(a)" } //return UIColor from Hexadecimal Color string public convenience init?(hexString: String) { let r, g, b, a: CGFloat if hexString.hasPrefix("#") { let start = hexString.index(hexString.startIndex, offsetBy: 1) let hexColor = hexString.substring(from: start) if hexColor.characters.count == 8 { let scanner = Scanner(string: hexColor) var hexNumber: UInt64 = 0 if scanner.scanHexInt64(&hexNumber) { r = CGFloat((hexNumber & 0xff000000) >> 24) / 255 g = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255 b = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255 a = CGFloat(hexNumber & 0x000000ff) / 255 self.init(red: r, green: g, blue: b, alpha: a) return } } } return nil } // Convert UIColor to Hexadecimal String func toHexString() -> String { var r: CGFloat = 0 var g: CGFloat = 0 var b: CGFloat = 0 var a: CGFloat = 0 self.getRed(&r, green: &g, blue: &b, alpha: &a) return String( format: "%02X%02X%02X", Int(r * 0xff), Int(g * 0xff), Int(b * 0xff)) } }
расширение UIColor, это очень поможет вам! (версия: Swift 4.0)
import UIKit extension UIColor { /// rgb颜色 convenience init(r: CGFloat, g: CGFloat, b: CGFloat) { self.init(red: r/255.0 ,green: g/255.0 ,blue: b/255.0 ,alpha:1.0) } /// 纯色(用于灰色) convenience init(gray: CGFloat) { self.init(red: gray/255.0 ,green: gray/255.0 ,blue: gray/255.0 ,alpha:1.0) } /// 随机色 class func randomCGColor() -> UIColor { return UIColor(r: CGFloat(arc4random_uniform(256)), g: CGFloat(arc4random_uniform(256)), b: CGFloat(arc4random_uniform(256))) } /// hex颜色-Int convenience init(hex:Int, alpha:CGFloat = 1.0) { self.init( red: CGFloat((hex & 0xFF0000) >> 16) / 255.0, green: CGFloat((hex & 0x00FF00) >> 8) / 255.0, blue: CGFloat((hex & 0x0000FF) >> 0) / 255.0, alpha: alpha ) } /// hex颜色-String convenience init(hexString: String){ var red: CGFloat = 0.0 var green: CGFloat = 0.0 var blue: CGFloat = 0.0 var alpha: CGFloat = 1.0 let scanner = Scanner(string: hexString) var hexValue: CUnsignedLongLong = 0 if scanner.scanHexInt64(&hexValue) { switch (hexString.characters.count) { case 3: red = CGFloat((hexValue & 0xF00) >> 8) / 15.0 green = CGFloat((hexValue & 0x0F0) >> 4) / 15.0 blue = CGFloat(hexValue & 0x00F) / 15.0 case 4: red = CGFloat((hexValue & 0xF000) >> 12) / 15.0 green = CGFloat((hexValue & 0x0F00) >> 8) / 15.0 blue = CGFloat((hexValue & 0x00F0) >> 4) / 15.0 alpha = CGFloat(hexValue & 0x000F) / 15.0 case 6: red = CGFloat((hexValue & 0xFF0000) >> 16) / 255.0 green = CGFloat((hexValue & 0x00FF00) >> 8) / 255.0 blue = CGFloat(hexValue & 0x0000FF) / 255.0 case 8: alpha = CGFloat((hexValue & 0xFF000000) >> 24) / 255.0 red = CGFloat((hexValue & 0x00FF0000) >> 16) / 255.0 green = CGFloat((hexValue & 0x0000FF00) >> 8) / 255.0 blue = CGFloat(hexValue & 0x000000FF) / 255.0 default: log.info("Invalid RGB string, number of characters after '#' should be either 3, 4, 6 or 8") } } else { log.error("Scan hex error") } self.init(red:red, green:green, blue:blue, alpha:alpha) }}
RGBA версия Swift 3/4
мне нравится ответ @Luca, поскольку я думаю, что это самый элегантный.
Я не хочу, чтобы мои цвета были указаны в ARGB. Я бы предпочел RGBA + также мне нужно было взломать в случае работы со строками, которые указывают 1 символ для каждого из каналов"#FFFA".
эта версия также добавляет ошибку бросая + полосы символ'#', если он включен в строка. Вот моя модифицированная форма для Swift.
public enum ColourParsingError: Error { case invalidInput(String) } extension UIColor { public convenience init(hexString: String) throws { let hexString = hexString.replacingOccurrences(of: "#", with: "") let hex = hexString.trimmingCharacters(in:NSCharacterSet.alphanumerics.inverted) var int = UInt32() Scanner(string: hex).scanHexInt32(&int) let a, r, g, b: UInt32 switch hex.count { case 3: // RGB (12-bit) (r, g, b,a) = ((int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17,255) //iCSS specification in the form of #F0FA case 4: // RGB (24-bit) (r, g, b,a) = ((int >> 12) * 17, (int >> 8 & 0xF) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) case 6: // RGB (24-bit) (r, g, b, a) = (int >> 16, int >> 8 & 0xFF, int & 0xFF,255) case 8: // ARGB (32-bit) (r, g, b, a) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) default: throw ColourParsingError.invalidInput("String is not a valid hex colour string: \(hexString)") } self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255) } }
просто некоторые дополнения к первому ответу
(не cehcked Альфа, возможно, потребуется добавить
if netHext > 0xffffff):extension UIColor { struct COLORS_HEX { static let Primary = 0xffffff static let PrimaryDark = 0x000000 static let Accent = 0xe89549 static let AccentDark = 0xe27b2a static let TextWhiteSemiTransparent = 0x80ffffff } convenience init(red: Int, green: Int, blue: Int, alphaH: Int) { assert(red >= 0 && red <= 255, "Invalid red component") assert(green >= 0 && green <= 255, "Invalid green component") assert(blue >= 0 && blue <= 255, "Invalid blue component") assert(alphaH >= 0 && alphaH <= 255, "Invalid alpha component") self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: CGFloat(alphaH) / 255.0) } convenience init(netHex:Int) { self.init(red:(netHex >> 16) & 0xff, green:(netHex >> 8) & 0xff, blue:netHex & 0xff, alphaH: (netHex >> 24) & 0xff) } }
Swift 2.3: Расширение UIColor. Я думаю, что это проще.
extension UIColor { static func colorFromHex(hexString: String, alpha: CGFloat = 1) -> UIColor { //checking if hex has 7 characters or not including '#' if hexString.characters.count < 7 { return UIColor.whiteColor() } //string by removing hash let hexStringWithoutHash = hexString.substringFromIndex(hexString.startIndex.advancedBy(1)) //I am extracting three parts of hex color Red (first 2 characters), Green (middle 2 characters), Blue (last two characters) let eachColor = [ hexStringWithoutHash.substringWithRange(hexStringWithoutHash.startIndex...hexStringWithoutHash.startIndex.advancedBy(1)), hexStringWithoutHash.substringWithRange(hexStringWithoutHash.startIndex.advancedBy(2)...hexStringWithoutHash.startIndex.advancedBy(3)), hexStringWithoutHash.substringWithRange(hexStringWithoutHash.startIndex.advancedBy(4)...hexStringWithoutHash.startIndex.advancedBy(5))] let hexForEach = eachColor.map {CGFloat(Int(, radix: 16) ?? 0)} //radix is base of numeric system you want to convert to, Hexadecimal has base 16 //return the color by making color return UIColor(red: hexForEach[0] / 255, green: hexForEach[1] / 255, blue: hexForEach[2] / 255, alpha: alpha) } }использование:
let color = UIColor.colorFromHex("#25ac09")
Swift 3
extension UIColor { convenience init(r: Int, g: Int, b: Int, a: Int = 255) { self.init(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: CGFloat(a) / 255.0) } convenience init(netHex:Int) { self.init(r:(netHex >> 16) & 0xff, g:(netHex >> 8) & 0xff, b:netHex & 0xff) } }использование:
self.view.backgroundColor = UIColor(netHex: 0x27ae60)
Swift 4.0
используйте эту единственную строку метода
override func viewDidLoad() { super.viewDidLoad() let color = UIColor(hexColor: "FF00A0") self.view.backgroundColor = color }вы должны создать новый класс или использовать любой контроллер, где u нужно использовать шестнадцатеричный цвет. Этот класс расширения предоставляет вам UIColor, который преобразует Hex в цвет RGB.
extension UIColor { convenience init(hexColor: String) { let scannHex = Scanner(string: hexColor) var rgbValue: UInt64 = 0 scannHex.scanLocation = 0 scannHex.scanHexInt64(&rgbValue) let r = (rgbValue & 0xff0000) >> 16 let g = (rgbValue & 0xff00) >> 8 let b = rgbValue & 0xff self.init( red: CGFloat(r) / 0xff, green: CGFloat(g) / 0xff, blue: CGFloat(b) / 0xff, alpha: 1 ) } }
extension UIColor { convenience init(hex: Int, alpha: Double = 1.0) { self.init(red: CGFloat((hex>>16)&0xFF)/255.0, green:CGFloat((hex>>8)&0xFF)/255.0, blue: CGFloat((hex)&0xFF)/255.0, alpha: CGFloat(255 * alpha) / 255) } }используйте это расширение, например:
let selectedColor = UIColor(hex: 0xFFFFFF) let selectedColor = UIColor(hex: 0xFFFFFF, alpha: 0.5)
Я сделал небольшую функцию, разместил ее там, где я могу использовать ее глобально и отлично работать с swift 2.1:
func getColorFromHex(rgbValue:UInt32)->UIColor{ let red = CGFloat((rgbValue & 0xFF0000) >> 16)/255.0 let green = CGFloat((rgbValue & 0xFF00) >> 8)/255.0 let blue = CGFloat(rgbValue & 0xFF)/255.0 return UIColor(red:red, green:green, blue:blue, alpha:1.0) }использование:
getColorFromHex(0xffffff)



Comments