Estoy tratando de usar valores de color hexadecimales en Swift, en lugar de los pocos estándares que UIColorte permiten usar, pero no tengo idea de cómo hacerlo.
#ffffffen realidad son 3 componentes de color en notación hexadecimal: rojo ff, verde ffy azul ff. Puede escribir notación hexadecimal en Swift usando el 0xprefijo, por ejemplo 0xFF.
#ffffffen realidad son 3 componentes de color en notación hexadecimal: rojo ff, verde ffy azul ff. Puede escribir notación hexadecimal en Swift usando el 0xprefijo, por ejemplo0xFF
Para simplificar la conversión, creemos un inicializador que tome valores enteros (0 - 255):
extensionUIColor{convenienceinit(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)}convenienceinit(rgb:Int){self.init(
red:(rgb >>16)&0xFF,
green:(rgb >>8)&0xFF,
blue: rgb &0xFF)}}
Uso:
let color =UIColor(red:0xFF, green:0xFF, blue:0xFF)let color2=UIColor(rgb:0xFFFFFF)
¿Cómo obtener alfa?
Dependiendo de su caso de uso, simplemente puede usar el UIColor.withAlphaComponentmétodo nativo , p. Ej.
let semitransparentBlack =UIColor(rgb:0x000000).withAlphaComponent(0.5)
O puede agregar un parámetro adicional (opcional) a los métodos anteriores:
¡Gran solución! ¿Por qué demonios Apple ya no tiene algo como esto?
Oliver Spryn
1
@confile No, porque eso no está estandarizado. Alfa puede ser el primer componente o el último. Si necesita alfa, simplemente agregue un parámetroalpha
¿Por qué no usar UInt8 en lugar de afirmar que sus entradas están en el rango 0 ... 255?
Richard Venable
55
Es 2017, y Apple todavía no tiene algo como esto.
AnBisw
351
Esta es una función que toma una cadena hexadecimal y devuelve un UIColor. (Puede ingresar cadenas hexadecimales con cualquier formato: #ffffffo ffffff)
@Hlung y @ethanstrider parece que ni siquiera te dejan hacer countahora en lugar de countElements, ¿alguna idea de lo que quieren que usemos?
SRMR
2
Cambió esta línea de código cString = cString.substringFromIndex(advance(cString.startIndex, 1))a cString = cString.substringFromIndex(cString.startIndex.advancedBy(1))Swift 2.2 Xcode 7.3
jaytrixz el
1
Si todavía es compatible con iPhone 5 o cualquier dispositivo de 32 bits anterior a iOS 11, se bloqueará. Necesitas cambiar el UInt32aUInt64
Kegham K.
1
Xcode 11 y el SDK de iOS13 son obsoletos scanHexInt32. Use una UInt64y scanHexInt64en su lugar.
Adam Waite
190
Extensión de UIColor Swift 5 (Swift 4, Swift 3) :
extensionUIColor{convenienceinit(hexString:String){let hex = hexString.trimmingCharacters(in:CharacterSet.alphanumerics.inverted)var int =UInt64()Scanner(string: hex).scanHexInt64(&int)let a, r, g, b:UInt64switch hex.count {case3:// RGB (12-bit)
(a, r, g, b)=(255,(int >>8)*17,(int >>4&0xF)*17,(int &0xF)*17)case6:// RGB (24-bit)
(a, r, g, b)=(255, int >>16, int >>8&0xFF, int &0xFF)case8:// 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)}}
Uso :
let darkGrey =UIColor(hexString:"#757575")
Versión Swift 2.x :
extensionUIColor{convenienceinit(hexString:String){let hex = hexString.stringByTrimmingCharactersInSet(NSCharacterSet.alphanumericCharacterSet().invertedSet)var int =UInt32()NSScanner(string: hex).scanHexInt(&int)let a, r, g, b:UInt32switch hex.characters.count {case3:// RGB (12-bit)
(a, r, g, b)=(255,(int >>8)*17,(int >>4&0xF)*17,(int &0xF)*17)case6:// RGB (24-bit)
(a, r, g, b)=(255, int >>16, int >>8&0xFF, int &0xFF)case8:// 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)}}
Esta es mi implementación favorita debido a la forma en que maneja los 3 casos. Pero prefiero el valor predeterminado: case para devolver nil, en lugar de white.
Richard Venable
por cierto, el caso predeterminado en esta implementación parece ser UIColor.yellow ()
Gui Moura
Sé cómo usarlo y funciona a las mil maravillas. Pero realmente no entiendo por qué. ¿Quizás alguien me puede dar una explicación o algunos enlaces / palabras buenos para buscar?
kuzdu
2
Esto no funciona correctamente con valores alfa. Por ejemplo, ambas entradas "ff00ff00" y "# ff00ff00" generarán un RGBA de 0 1 0 1. (Debería ser 1 0 1 0). La entrada "# ff00ff" da como resultado 1 0 1 1, que es correcta. (Xcode 8.2.1, iOS 9.3.)
Womble
2
@Womble el primer componente es el alfa, no el último. Entonces "# ff00ff00" tiene alfa 1 debido a "ff" al principio. Creo que quisiste decir "# 00ff00ff". Otro ejemplo: "# ff00ff00" esto es verde con alfa 1, "# 0000ff00" esto es verde con alfa 0
En mi humilde opinión, este es el más fácil de usar y muy claro en comparación con otras respuestas.
thandasoru
1
¿Cómo manejarías 123ABC? El compilador está burlando de que no sea un dígito.
Islam Q.
1
para completar: let foo: Int = 0x123ABC- tenga en cuenta el '0x'
Carsten
Por desgracia, como muchos otros convertidores hexadecimales, esto no maneja componentes alfa. Entonces, por ejemplo, no puede obtener un valor UIColor.clear de él.
Womble
1
Si bien no maneja alpha @Womble, es trivial agregarlo. Tuve que establecer un tipo explícito para "componentes" para evitar que el compilador Swift "demore demasiado" y se rinda.
Norman
43
Swift 4 : Combinando las respuestas de Sulthan y Luca Torella:
extensionUIColor{convenienceinit(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
)}}
Ejemplos de uso:
let myColor =UIColor(hexFromString:"4F9BF5")let myColor =UIColor(hexFromString:"#4F9BF5")let myColor =UIColor(hexFromString:"#4F9BF5", alpha:0.5)
La forma más sencilla de agregar color mediante programación es mediante ColorLiteral .
Simplemente agregue la propiedad ColorLiteral como se muestra en el ejemplo, Xcode le solicitará una lista completa de colores que puede elegir. La ventaja de hacerlo es un código menor, agregue valores HEX o RGB . También obtendrá los colores utilizados recientemente del guión gráfico.
Esta respuesta muestra cómo hacerlo en Obj-C. El puente es para usar
let rgbValue =0xFFEEDDlet r =Float((rgbValue &0xFF0000)>>16)/255.0let g =Float((rgbValue &0xFF00)>>8)/255.0let b =Float((rgbValue &0xFF))/255.0self.backgroundColor =UIColor(red:r, green: g, blue: b, alpha:1.0)
No me di cuenta de que podías definir los colores como Activos. Realmente me alegro de haber encontrado esta respuesta!
Justyn
6
Otro método
Swift 3.0
Escribir una extensión para UIColor
// To change the HexaDecimal value to Corresponding Color
extensionUIColor{classfunc uicolorFromHex(_ rgbValue:UInt32, alpha :CGFloat)->UIColor{let red =CGFloat((rgbValue &0xFF0000)>>16)/255.0let green =CGFloat((rgbValue &0xFF00)>>8)/255.0let blue =CGFloat(rgbValue &0xFF)/255.0returnUIColor(red:red, green:green, blue:blue, alpha: alpha)}}
puedes crear directamente UIColor con hexadecimal como este
let carrot =UIColor.uicolorFromHex(0xe67e22, alpha:1))
Esto es lo que estoy usando. Funciona con cadenas de color de 6 y 8 caracteres, con o sin el símbolo #. El valor predeterminado es negro en la versión y se bloquea en la depuración cuando se inicializa con una cadena no válida.
extensionUIColor{publicconvenienceinit(hex:String){var r:CGFloat=0var g:CGFloat=0var b:CGFloat=0var a:CGFloat=1let hexColor = hex.replacingOccurrences(of:"#", with:"")let scanner =Scanner(string: hexColor)var hexNumber:UInt64=0var valid =falseif scanner.scanHexInt64(&hexNumber){if hexColor.count ==8{
r =CGFloat((hexNumber &0xff000000)>>24)/255
g =CGFloat((hexNumber &0x00ff0000)>>16)/255
b =CGFloat((hexNumber &0x0000ff00)>>8)/255
a =CGFloat(hexNumber &0x000000ff)/255
valid =true}elseif hexColor.count ==6{
r =CGFloat((hexNumber &0xff0000)>>16)/255
g =CGFloat((hexNumber &0x00ff00)>>8)/255
b =CGFloat(hexNumber &0x0000ff)/255
valid =true}}#if DEBUG
assert(valid,"UIColor initialized with invalid hex string")#endif
self.init(red: r, green: g, blue: b, alpha: a)}}
Aquí hay una extensión Swift UIColorque toma una cadena hexadecimal:
importUIKitextensionUIColor{convenienceinit(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=0NSScanner(string: cleanedHexString).scanHexInt(&rgbValue)// UInt32 -> R,G,B
let red =CGFloat((rgbValue >>16)&0xff)/255.0let green =CGFloat((rgbValue >>08)&0xff)/255.0let blue =CGFloat((rgbValue >>00)&0xff)/255.0self.init(red: red, green: green, blue: blue, alpha:1.0)}}
var color:UIColor= hexStringToUIColor(hex:"#00ff00");// Without transparency
var colorWithTransparency:UIColor= hexStringToUIColor(hex:"#dd00ff00");//With transparency
PRECAUCIÓN: Esta no es una "solución de un solo archivo", hay algunas dependencias, pero buscarlas puede ser más rápido que investigar esto desde cero.
extensionUIColor{convenienceinit(hexString:String){let hexString:NSString= hexString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())let scanner =NSScanner(string: hexString asString)if(hexString.hasPrefix("#")){
scanner.scanLocation =1}var color:UInt32=0
scanner.scanHexInt(&color)let mask =0x000000FFlet r =Int(color >>16)& mask
let g =Int(color >>8)& mask
let b =Int(color)& mask
let red =CGFloat(r)/255.0let green =CGFloat(g)/255.0let blue =CGFloat(b)/255.0self.init(red:red, green:green, blue:blue, alpha:1)}func toHexString()->String{var r:CGFloat=0var g:CGFloat=0var b:CGFloat=0var 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)<<0returnNSString(format:"#%06x", rgb)asString}}
Uso:
//Hex to Color
let countPartColor =UIColor(hexString:"E43038")//Color to Hex
let colorHexString =UIColor(red:228, green:48, blue:56, alpha:1.0).toHexString()
solo una combinación de las respuestas anteriores.
Sulthan
0
Versión RGBA Swift 3/4
Me gusta la respuesta de @ Luca porque creo que es la más elegante.
Sin embargo , no quiero que mis colores se especifiquen en ARGB . Prefiero RGBA + también necesito hackear en el caso de tratar con cadenas que especifican 1 carácter para cada uno de los canales " #FFFA ".
Esta versión también agrega error al lanzar + elimina el carácter '#' si está incluido en la cadena. Aquí está mi forma modificada para Swift.
publicenumColourParsingError:Error{case invalidInput(String)}extensionUIColor{publicconvenienceinit(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:UInt32switch hex.count
{case3:// 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
case4:// RGB (24-bit)
(r, g, b,a)=((int >>12)*17,(int >>8&0xF)*17,(int >>4&0xF)*17,(int &0xF)*17)case6:// RGB (24-bit)
(r, g, b, a)=(int >>16, int >>8&0xFF, int &0xFF,255)case8:// ARGB (32-bit)
(r, g, b, a)=(int >>24, int >>16&0xFF, int >>8&0xFF, int &0xFF)default:throwColourParsingError.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)}}
#ffffff
en realidad son 3 componentes de color en notación hexadecimal: rojoff
, verdeff
y azulff
. Puede escribir notación hexadecimal en Swift usando el0x
prefijo, por ejemplo0xFF
.Respuestas:
#ffffff
en realidad son 3 componentes de color en notación hexadecimal: rojoff
, verdeff
y azulff
. Puede escribir notación hexadecimal en Swift usando el0x
prefijo, por ejemplo0xFF
Para simplificar la conversión, creemos un inicializador que tome valores enteros (0 - 255):
Uso:
¿Cómo obtener alfa?
Dependiendo de su caso de uso, simplemente puede usar el
UIColor.withAlphaComponent
método nativo , p. Ej.O puede agregar un parámetro adicional (opcional) a los métodos anteriores:
(no podemos nombrar el parámetro
alpha
debido a una colisión de nombres con el inicializador existente).Llamado:
Para obtener el alfa como un entero 0-255, podemos
Llamado
O una combinación de los métodos anteriores. No hay absolutamente ninguna necesidad de usar cadenas.
fuente
alpha
Esta es una función que toma una cadena hexadecimal y devuelve un UIColor.
(Puede ingresar cadenas hexadecimales con cualquier formato:
#ffffff
offffff
)Uso:
Swift 5: (Swift 4+)
Swift 3:
Swift 2:
Fuente: arshad / gist: de147c42d7b3063ef7bc
Editar: se actualizó el código. ¡Gracias, Hlung, Jaytrixz, Ahmad F, Kegham K y Adam Waite!
fuente
countelements
ahora es solocount
:)count
ahora en lugar decountElements
, ¿alguna idea de lo que quieren que usemos?cString = cString.substringFromIndex(advance(cString.startIndex, 1))
acString = cString.substringFromIndex(cString.startIndex.advancedBy(1))
Swift 2.2 Xcode 7.3UInt32
aUInt64
scanHexInt32
. Use unaUInt64
yscanHexInt64
en su lugar.Extensión de UIColor Swift 5 (Swift 4, Swift 3) :
Uso :
Versión Swift 2.x :
fuente
UIColor
:CGColor
:Uso
fuente
let foo: Int = 0x123ABC
- tenga en cuenta el '0x'Swift 4 : Combinando las respuestas de Sulthan y Luca Torella:
Ejemplos de uso:
fuente
Con Swift 2.0 y Xcode 7.0.1 puede crear esta función:
y luego úsalo de esta manera:
Actualizado para Swift 4
fuente
Swift 5.1: compatibilidad con nombres de colores hexadecimales y CSS a través de UIColor
Código esencial
Paquete Swift
Cadenas de ejemplo:
Orange
,Lime
,Tomato
, Etc.Clear
,Transparent
,nil
, Y el rendimiento de cadena vacía[UIColor clearColor]
abc
abc7
#abc7
00FFFF
#00FFFF
00FFFF77
Salida del patio de recreo:
fuente
La forma más sencilla de agregar color mediante programación es mediante ColorLiteral .
Simplemente agregue la propiedad ColorLiteral como se muestra en el ejemplo, Xcode le solicitará una lista completa de colores que puede elegir. La ventaja de hacerlo es un código menor, agregue valores HEX o RGB . También obtendrá los colores utilizados recientemente del guión gráfico.
Ejemplo: self.view.backgroundColor = ColorLiteral
fuente
Advertencia "'scanHexInt32' quedó en desuso en iOS 13.0" se corrigió.
La muestra debería funcionar en Swift2.2 y superior (Swift2.x, Swift3.x, Swift4.x, Swift5.x):
Úselos como a continuación:
fuente
Esta respuesta muestra cómo hacerlo en Obj-C. El puente es para usar
fuente
He combinado algunas ideas de este hilo de respuestas y lo actualicé para iOS 13 y Swift 5 .
Luego puede usarlo así:
fuente
Swift 5: puede crear colores en Xcode como se explica en las dos imágenes siguientes:
Debe nombrar el color porque hace referencia al color por el nombre. Como se muestra en la imagen 2:
fuente
Otro método
Swift 3.0
Escribir una extensión para UIColor
puedes crear directamente UIColor con hexadecimal como este
fuente
La última versión de swift3
Úselo en su clase o donde haya convertido de hexcolor a uicolor, de esta manera
fuente
Esto es lo que estoy usando. Funciona con cadenas de color de 6 y 8 caracteres, con o sin el símbolo #. El valor predeterminado es negro en la versión y se bloquea en la depuración cuando se inicializa con una cadena no válida.
Uso:
fuente
Aquí hay una extensión Swift
UIColor
que toma una cadena hexadecimal:fuente
Cómo utilizar
fuente
Hex con validación
Detalles
Solución
Uso
fuente
NSPredicate
solo necesita probar expresiones regulares.string.range(of: pattern, options: .regularExpression)
también funcionaPuedes usarlo en Swift 5
SWIFT 5
fuente
Extensión de color simple para Swift 5 / SwiftUI
Ejemplo:
Código:
fuente
Swift 2.0:
En viewDidLoad ()
fuente
Swift 5
Llamar usando UIColor (hexString: "su cadena hexadecimal")
fuente
Admite 7 tipos de color hexadecimal
Hay 7 formatos de color hexadecimales: "" # FF0000 "," 0xFF0000 "," FF0000 "," F00 "," rojo ", 0x00FF00, 16711935
PRECAUCIÓN: Esta no es una "solución de un solo archivo", hay algunas dependencias, pero buscarlas puede ser más rápido que investigar esto desde cero.
https://github.com/eonist/swift-utils/blob/2882002682c4d2a3dc7cb3045c45f66ed59d566d/geom/color/NSColorParser.swift
Enlace permanente:
https://github.com/eonist/Element/wiki/Progress#supporting-7-hex-color-types
fuente
Swift 2.0
El siguiente código se prueba en xcode 7.2
fuente
Swift 2.0:
Haz una extensión de UIColor.
Uso:
fuente
Para Swift 3
fuente
Puede usar esta extensión en UIColor que convierte Your String (Hexadecimal, RGBA) a UIColor y viceversa.
fuente
Extensión UIColor, ¡esto te ayudará mucho! (versión :Swift 4.0 )
fuente
Versión RGBA Swift 3/4
Me gusta la respuesta de @ Luca porque creo que es la más elegante.
Sin embargo , no quiero que mis colores se especifiquen en ARGB . Prefiero RGBA + también necesito hackear en el caso de tratar con cadenas que especifican 1 carácter para cada uno de los canales " #FFFA ".
Esta versión también agrega error al lanzar + elimina el carácter '#' si está incluido en la cadena. Aquí está mi forma modificada para Swift.
fuente
Uso:
fuente