Estou tentando usar valores de cores hexadecimais no Swift, em vez dos poucos padrões que UIColor permitem você use, mas não tenho idéia de como fazê-lo.
#ffffffsão na verdade três componentes de cor em notação hexadecimal - vermelho ff, verde ffe azul ff. Você pode escrever notação hexadecimal no Swift usando o 0xprefixo, por exemplo 0xFF.
#ffffffsão na verdade três componentes de cor em notação hexadecimal - vermelho ff, verde ffe azul ff. Você pode escrever notação hexadecimal no Swift usando o 0xprefixo, por exemplo0xFF
Para simplificar a conversão, vamos criar um inicializador que aceite valores inteiros (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)
Como obter alfa?
Dependendo do seu caso de uso, você pode simplesmente usar o UIColor.withAlphaComponentmétodo nativo , por exemplo
let semitransparentBlack =UIColor(rgb:0x000000).withAlphaComponent(0.5)
Ou você pode adicionar um parâmetro adicional (opcional) aos métodos acima:
Ótima solução! Por que diabos a Apple já não teria algo assim ????
Oliver Spryn
11
@confile Não, porque isso não é padronizado. Alfa pode ser o primeiro componente ou o último. Se você precisar de alfa, basta adicionar um parâmetroalpha
@Hlung e @ethanstrider, parece que eles nem sequer deixam você fazer countagora, em vez de countElements, alguma ideia do que eles querem que usemos?
SRMR 30/08/2015
2
Mudou esta linha de código cString = cString.substringFromIndex(advance(cString.startIndex, 1))para cString = cString.substringFromIndex(cString.startIndex.advancedBy(1))a Swift 2.2 Xcode 7.3
jaytrixz
11
Se você ainda suporta o iPhone 5 ou qualquer dispositivo de 32 bits anterior ao iOS 11, ele trava. Você precisa alterar o UInt32paraUInt64
Kegham K.
11
O Xcode 11 e o iOS13 SDK foram preteridos scanHexInt32. Use a UInt64e em scanHexInt64vez disso.
Adam Waite
190
Swift 5 (Swift 4, Swift 3) Extensão UIColor:
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")
Versão 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 é a minha implementação favorita devido à maneira como lida com os 3 casos. Mas eu prefiro o padrão: case para retornar nulo, em vez de branco.
Richard Venable 21/03
a propósito, o caso padrão nesta implementação parece ser UIColor.yellow ()
Gui Moura
Eu sei como usá-lo e funciona como um encanto. Mas eu realmente não entendo o porquê. Talvez alguém possa me dar uma explicação ou alguns bons links / palavras para pesquisar?
kuzdu
2
Isso não funciona corretamente com valores alfa. Por exemplo, ambas as entradas "ff00ff00" e "# ff00ff00" produzirão um RGBA de 0 1 0 1. (deve ser 1 0 1 0). A entrada "# ff00ff" resulta em 1 0 1 1, o que está correto. (Xcode 8.2.1, iOS 9.3.)
Womble
2
@Womble o primeiro componente é o alfa e não o último. Portanto, "# ff00ff00" possui alfa 1 por causa do "ff" no início. Eu acho que você quis dizer "# 00ff00ff". Outro exemplo: "# FF00FF00" este é verde com alpha 1, "# 0000ff00" este é verde com alpha 0
Na minha humilde opinião, achei isso o mais fácil de usar e muito claro em comparação com outras respostas.
thandasoru
11
Como você lidaria com o 123ABC? O compilador está tentando não ser um dígito.
Islam Q.
11
para completar: let foo: Int = 0x123ABC- observe o '0x'
Carsten
Infelizmente, como muitos outros conversores hexadecimais, isso não lida com componentes alfa. Portanto, por exemplo, você não pode obter um valor UIColor.clear.
Womble
11
Embora ele não lide com alpha @Womble, é trivial adicionar. Eu tive que definir um tipo explícito para "componentes" para impedir que o compilador Swift "demorasse muito" e desistisse.
Norman
43
Swift 4 : Combinando as respostas de Sulthan e 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
)}}
Exemplos de uso:
let myColor =UIColor(hexFromString:"4F9BF5")let myColor =UIColor(hexFromString:"#4F9BF5")let myColor =UIColor(hexFromString:"#4F9BF5", alpha:0.5)
A maneira mais simples de adicionar cores por meio de programação é usando o ColorLiteral .
Basta adicionar a propriedade ColorLiteral como mostrado no exemplo, o Xcode solicitará uma lista completa de cores que você pode escolher. A vantagem de fazer isso é um código menor, adicione valores HEX ou RGB . Você também obterá as cores usadas recentemente no storyboard.
Esta resposta mostra como fazê-lo no Obj-C. A ponte é 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)
Não sabia que era possível definir cores como Ativos. Muito feliz por ter encontrado esta resposta!
Justyn
6
Outro método
Swift 3.0
Escreva uma extensão 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)}}
você pode criar diretamente o UIColor com hexadecimal como este
let carrot =UIColor.uicolorFromHex(0xe67e22, alpha:1))
Aqui está o que estou usando. Funciona com seqüências de cores de 6 e 8 caracteres, com ou sem o símbolo #. O padrão é preto na versão e falha na depuração quando inicializado com uma sequência invá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)}}
Aqui está uma extensão Swift UIColorque leva uma string 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
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()
Gosto da resposta de @ Luca, pois acho que é a mais elegante.
No entanto , não quero minhas cores especificadas no ARGB . Eu prefiro o RGBA + também necessário hackear no caso de lidar com strings que especificam 1 caractere para cada um dos canais " #FFFA ".
Esta versão também adiciona um erro ao lançar + retira o caractere '#' se ele estiver incluído na string. Aqui está o meu formulário modificado 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
são na verdade três componentes de cor em notação hexadecimal - vermelhoff
, verdeff
e azulff
. Você pode escrever notação hexadecimal no Swift usando o0x
prefixo, por exemplo0xFF
.Respostas:
#ffffff
são na verdade três componentes de cor em notação hexadecimal - vermelhoff
, verdeff
e azulff
. Você pode escrever notação hexadecimal no Swift usando o0x
prefixo, por exemplo0xFF
Para simplificar a conversão, vamos criar um inicializador que aceite valores inteiros (0 - 255):
Uso:
Como obter alfa?
Dependendo do seu caso de uso, você pode simplesmente usar o
UIColor.withAlphaComponent
método nativo , por exemploOu você pode adicionar um parâmetro adicional (opcional) aos métodos acima:
(não podemos nomear o parâmetro
alpha
devido a uma colisão de nomes com o inicializador existente).Chamado como:
Para obter o alfa como um número inteiro de 0 a 255, podemos
Chamado como
Ou uma combinação dos métodos anteriores. Não há absolutamente nenhuma necessidade de usar strings.
fonte
alpha
Esta é uma função que pega uma sequência hexadecimal e retorna um UIColor.
(Você pode inserir cadeias hexadecimais com o formato:
#ffffff
ouffffff
)Uso:
Swift 5: (Swift 4 ou mais)
Swift 3:
Swift 2:
Fonte: arshad / gist: de147c42d7b3063ef7bc
Editar: atualizado o código. Obrigado, Hlung, Jaytrixz, Ahmad F., Kegham K e Adam Waite!
fonte
countelements
agora é apenascount
:)count
agora, em vez decountElements
, alguma ideia do que eles querem que usemos?cString = cString.substringFromIndex(advance(cString.startIndex, 1))
paracString = cString.substringFromIndex(cString.startIndex.advancedBy(1))
a Swift 2.2 Xcode 7.3UInt32
paraUInt64
scanHexInt32
. Use aUInt64
e emscanHexInt64
vez disso.Swift 5 (Swift 4, Swift 3) Extensão UIColor:
Uso :
Versão Swift 2.x :
fonte
UIColor
:CGColor
:Uso
fonte
let foo: Int = 0x123ABC
- observe o '0x'Swift 4 : Combinando as respostas de Sulthan e Luca Torella:
Exemplos de uso:
fonte
Com o Swift 2.0 e o Xcode 7.0.1, você pode criar esta função:
e depois use-o desta maneira:
Atualizado para o Swift 4
fonte
Swift 5.1: Suporte a nomes de cores hex e CSS via UIColor
Código de essência
Pacote Swift
Sequências de exemplo:
Orange
,Lime
,Tomato
, Etc.Clear
,Transparent
,nil
, E um rendimento de cadeia vazia[UIColor clearColor]
abc
abc7
#abc7
00FFFF
#00FFFF
00FFFF77
Saída do parque infantil:
fonte
A maneira mais simples de adicionar cores por meio de programação é usando o ColorLiteral .
Basta adicionar a propriedade ColorLiteral como mostrado no exemplo, o Xcode solicitará uma lista completa de cores que você pode escolher. A vantagem de fazer isso é um código menor, adicione valores HEX ou RGB . Você também obterá as cores usadas recentemente no storyboard.
Exemplo: self.view.backgroundColor = ColorLiteral
fonte
O aviso "'scanHexInt32' foi preterido no iOS 13.0" foi corrigido.
A amostra deve funcionar no Swift2.2 e acima (Swift2.x, Swift3.x, Swift4.x, Swift5.x):
Use-os como abaixo:
fonte
Esta resposta mostra como fazê-lo no Obj-C. A ponte é para usar
fonte
Mesclamos algumas idéias deste tópico de respostas e atualizei-o para iOS 13 e Swift 5 .
Você pode usá-lo assim:
fonte
Swift 5: Você pode criar cores no Xcode, conforme explicado nas duas imagens a seguir:
Você deve nomear a cor porque faz referência à cor pelo nome. Como mostra a imagem 2:
fonte
Outro método
Swift 3.0
Escreva uma extensão para UIColor
você pode criar diretamente o UIColor com hexadecimal como este
fonte
Versão mais recente do swift3
Use na sua classe ou onde quer que você tenha convertido em hexcolor para uicolor, desta maneira
fonte
Aqui está o que estou usando. Funciona com seqüências de cores de 6 e 8 caracteres, com ou sem o símbolo #. O padrão é preto na versão e falha na depuração quando inicializado com uma sequência inválida.
Uso:
fonte
Aqui está uma extensão Swift
UIColor
que leva uma string hexadecimal:fonte
Como usar
fonte
Hex com validação
Detalhes
Solução
Uso
fonte
NSPredicate
apenas testar expressões regulares.string.range(of: pattern, options: .regularExpression)
funciona tambémVocê pode usá-lo rapidamente 5
SWIFT 5
fonte
Extensão de cor simples para Swift 5 / SwiftUI
Exemplo:
Código:
fonte
Swift 2.0:
Em viewDidLoad ()
fonte
Swift 5
Ligue usando UIColor (hexString: "sua sequência hexadecimal")
fonte
Suportando 7 tipos de cores Hex
Existem 7 formatos de cores hexadecimais: "" # FF0000 "," 0xFF0000 "," FF0000 "," F00 "," vermelho ", 0x00FF00, 16711935
CUIDADO: Esta não é uma "solução de arquivo único", existem algumas dependências, mas procurá-las pode ser mais rápido do que pesquisar isso do zero.
https://github.com/eonist/swift-utils/blob/2882002682c4d2a3dc7cb3045c45f66ed59d566d/geom/color/NSColorParser.swift
Permalink:
https://github.com/eonist/Element/wiki/Progress#supporting-7-hex-color-types
fonte
Swift 2.0
O código abaixo é testado no xcode 7.2
fonte
Swift 2.0:
Faça uma extensão do UIColor.
Uso:
fonte
Para rápido 3
fonte
Você pode usar esta extensão no UIColor, que converte Sua String (Hexadecimal, RGBA) em UIColor e vice-versa.
fonte
Extensão UIColor, isso irá ajudá-lo muito! (versão: Swift 4.0 )
fonte
Versão RGBA Swift 3/4
Gosto da resposta de @ Luca, pois acho que é a mais elegante.
No entanto , não quero minhas cores especificadas no ARGB . Eu prefiro o RGBA + também necessário hackear no caso de lidar com strings que especificam 1 caractere para cada um dos canais " #FFFA ".
Esta versão também adiciona um erro ao lançar + retira o caractere '#' se ele estiver incluído na string. Aqui está o meu formulário modificado para Swift.
fonte
Uso:
fonte