Comment utiliser les valeurs de couleur hexadécimales
352
J'essaie d'utiliser des valeurs de couleur hexadécimales dans Swift, au lieu des quelques valeurs standard qui UIColorvous permettent d'utiliser, mais je ne sais pas comment le faire.
#ffffffsont en fait 3 composants de couleur en notation hexadécimale - rouge ff, vert ffet bleu ff. Vous pouvez écrire une notation hexadécimale dans Swift en utilisant un 0xpréfixe, par exemple 0xFF.
#ffffffsont en fait 3 composants de couleur en notation hexadécimale - rouge ff, vert ffet bleu ff. Vous pouvez écrire la notation hexadécimale dans Swift en utilisant un 0xpréfixe, par exemple0xFF
Pour simplifier la conversion, créons un initialiseur qui prend des valeurs entières (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)}}
Usage:
let color =UIColor(red:0xFF, green:0xFF, blue:0xFF)let color2=UIColor(rgb:0xFFFFFF)
Comment obtenir l'alpha?
En fonction de votre cas d'utilisation, vous pouvez simplement utiliser la UIColor.withAlphaComponentméthode native , par exemple
let semitransparentBlack =UIColor(rgb:0x000000).withAlphaComponent(0.5)
Ou vous pouvez ajouter un paramètre supplémentaire (facultatif) aux méthodes ci-dessus:
Excellente solution! Pourquoi diable Apple n'aurait-il pas déjà quelque chose comme ça ????
Oliver Spryn
1
@confile Non, car ce n'est pas standardisé. Alpha peut être le premier ou le dernier composant. Si vous avez besoin d'alpha, ajoutez simplement un paramètrealpha
Pourquoi ne pas utiliser UInt8 au lieu d'affirmer que vos entrées sont dans la plage 0 ... 255?
Richard Venable
5
Nous sommes en 2017 et Apple n'a toujours pas quelque chose comme ça.
AnBisw
351
Il s'agit d'une fonction qui prend une chaîne hexadécimale et renvoie un UIColor. (Vous pouvez entrer des chaînes hexadécimales avec l'un #ffffffou l' autre format: ou ffffff)
@Hlung et @ethanstrider on dirait qu'ils ne vous laissent même pas faire countmaintenant au lieu de countElements, une idée de ce qu'ils veulent que nous utilisions ?
SRMR
2
Changé cette ligne de code cString = cString.substringFromIndex(advance(cString.startIndex, 1))à cString = cString.substringFromIndex(cString.startIndex.advancedBy(1))Swift 2.2 Xcode 7.3
jaytrixz
1
Si vous prenez toujours en charge l'iPhone 5 ou tout appareil 32 bits avant iOS 11, il se bloquera. Vous devez changer le UInt32pourUInt64
Kegham K.
1
Xcode 11 et le SDK iOS13 sont obsolètes scanHexInt32. Utilisez un UInt64et à la scanHexInt64place.
Adam Waite
190
Extension UIColor pour 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)}}
Utilisation :
let darkGrey =UIColor(hexString:"#757575")
Version 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)}}
C'est ma mise en œuvre préférée en raison de la façon dont elle gère les 3 cas. Mais je préfère la valeur par défaut: case à retourner nulle, au lieu de blanche.
Richard Venable
au fait, le cas par défaut dans cette implémentation semble être UIColor.yellow ()
Gui Moura
Je sais comment l'utiliser et ça marche comme un charme. Mais je ne comprends pas vraiment pourquoi. Peut-être que quelqu'un peut me donner une explication ou de bons liens / mots à rechercher?
kuzdu
2
Cela ne fonctionne pas correctement avec les valeurs alpha. Par exemple, les deux entrées "ff00ff00" et "# ff00ff00" produiront une RVBA de 0 1 0 1. (Elle devrait être de 1 0 1 0). L'entrée "# ff00ff" donne 1 0 1 1, ce qui est correct. (Xcode 8.2.1, iOS 9.3.)
Womble
2
@Womble le premier composant est l'alpha et non le dernier. Donc "# ff00ff00" a alpha 1 à cause du "ff" au début. Je pense que vous vouliez dire "# 00ff00ff". Un autre exemple: "# ff00ff00" c'est vert avec alpha 1, "# 0000ff00" c'est vert avec alpha 0
À mon humble avis, j'ai trouvé cela le plus facile à utiliser et très clair par rapport aux autres réponses.
thandasoru
1
Comment géreriez-vous 123ABC? Le compilateur est entrain de ne pas être un chiffre.
Islam Q.
1
pour être complet: let foo: Int = 0x123ABC- notez le '0x'
Carsten
Hélas, comme beaucoup d'autres convertisseurs hexadécimaux, cela ne gère pas les composants alpha. Ainsi, par exemple, vous ne pouvez pas en obtenir une valeur UIColor.clear.
Womble
1
Bien qu'il ne gère pas alpha @Womble, il est trivial d'ajouter. J'ai dû définir un type explicite pour les "composants" pour empêcher le compilateur Swift de "prendre trop de temps" et d'abandonner.
Norman
43
Swift 4 : Combiner les réponses de Sulthan et 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
)}}
Exemples d'utilisation:
let myColor =UIColor(hexFromString:"4F9BF5")let myColor =UIColor(hexFromString:"#4F9BF5")let myColor =UIColor(hexFromString:"#4F9BF5", alpha:0.5)
La façon la plus simple d'ajouter des couleurs par programmation est d'utiliser ColorLiteral .
Ajoutez simplement la propriété ColorLiteral comme indiqué dans l'exemple, Xcode vous demandera une liste complète de couleurs que vous pouvez choisir. L'avantage est de réduire le code, d' ajouter des valeurs HEX ou RVB . Vous obtiendrez également les couleurs récemment utilisées dans le storyboard.
Cette réponse montre comment le faire dans Obj-C. Le pont est à utiliser
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)
Je ne savais pas que vous pouviez définir les couleurs comme des actifs. Vraiment content d'avoir trouvé cette réponse!
Justyn
6
Une autre méthode
Swift 3.0
Écrire une extension pour 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)}}
vous pouvez créer directement UIColor avec hex comme ceci
let carrot =UIColor.uicolorFromHex(0xe67e22, alpha:1))
Voici ce que j'utilise. Fonctionne avec des chaînes de couleurs de 6 et 8 caractères, avec ou sans le symbole #. La valeur par défaut est noire dans la version et se bloque dans le débogage lorsqu'elle est initialisée avec une chaîne non valide.
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)}}
Voici une extension Swift UIColorqui prend une chaîne hexadécimale:
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
Vous n'avez pas NSPredicateseulement besoin de tester des expressions régulières. string.range(of: pattern, options: .regularExpression)fonctionne aussi.
ATTENTION: Ce n'est pas une "solution à un fichier", il existe certaines dépendances, mais les rechercher peut être plus rapide que de rechercher cela à partir de zéro.
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}}
Usage:
//Hex to Color
let countPartColor =UIColor(hexString:"E43038")//Color to Hex
let colorHexString =UIColor(red:228, green:48, blue:56, alpha:1.0).toHexString()
J'aime la réponse de @ Luca car je pense que c'est la plus élégante.
Cependant, je ne veux pas que mes couleurs soient spécifiées dans ARGB . Je préfère RGBA + également, je devais pirater dans le cas de traiter des chaînes qui spécifient 1 caractère pour chacun des canaux " #FFFA ".
Cette version ajoute également le lancement d'erreur + supprime le caractère '#' s'il est inclus dans la chaîne. Voici mon formulaire modifié pour 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
sont en fait 3 composants de couleur en notation hexadécimale - rougeff
, vertff
et bleuff
. Vous pouvez écrire une notation hexadécimale dans Swift en utilisant un0x
préfixe, par exemple0xFF
.Réponses:
#ffffff
sont en fait 3 composants de couleur en notation hexadécimale - rougeff
, vertff
et bleuff
. Vous pouvez écrire la notation hexadécimale dans Swift en utilisant un0x
préfixe, par exemple0xFF
Pour simplifier la conversion, créons un initialiseur qui prend des valeurs entières (0 - 255):
Usage:
Comment obtenir l'alpha?
En fonction de votre cas d'utilisation, vous pouvez simplement utiliser la
UIColor.withAlphaComponent
méthode native , par exempleOu vous pouvez ajouter un paramètre supplémentaire (facultatif) aux méthodes ci-dessus:
(nous ne pouvons pas nommer le paramètre en
alpha
raison d'une collision de noms avec l'initialiseur existant).Appelé comme:
Pour obtenir l'alpha sous forme d'entier 0-255, nous pouvons
Appelé comme
Ou une combinaison des méthodes précédentes. Il n'est absolument pas nécessaire d'utiliser des chaînes.
la source
alpha
Il s'agit d'une fonction qui prend une chaîne hexadécimale et renvoie un UIColor.
(Vous pouvez entrer des chaînes hexadécimales avec l'un
#ffffff
ou l' autre format: ouffffff
)Usage:
Swift 5: (Swift 4+)
Swift 3:
Swift 2:
Source: arshad / gist: de147c42d7b3063ef7bc
Edit: mise à jour du code. Merci, Hlung, jaytrixz, Ahmad F, Kegham K et Adam Waite!
la source
countelements
est maintenant justecount
:)count
maintenant au lieu decountElements
, une idée de ce qu'ils veulent que nous utilisions ?cString = cString.substringFromIndex(advance(cString.startIndex, 1))
àcString = cString.substringFromIndex(cString.startIndex.advancedBy(1))
Swift 2.2 Xcode 7.3UInt32
pourUInt64
scanHexInt32
. Utilisez unUInt64
et à lascanHexInt64
place.Extension UIColor pour Swift 5 (Swift 4, Swift 3) :
Utilisation :
Version Swift 2.x :
la source
UIColor
:CGColor
:Usage
la source
let foo: Int = 0x123ABC
- notez le '0x'Swift 4 : Combiner les réponses de Sulthan et Luca Torella:
Exemples d'utilisation:
la source
Avec Swift 2.0 et Xcode 7.0.1, vous pouvez créer cette fonction:
puis utilisez-le de cette manière:
Mise à jour pour Swift 4
la source
Swift 5.1: prise en charge des noms de couleurs Hex et CSS via un UIColor
Code Gist
Forfait Swift
Exemples de chaînes:
Orange
,Lime
,Tomato
, Etc.Clear
,Transparent
,nil
Et le rendement de chaîne vide[UIColor clearColor]
abc
abc7
#abc7
00FFFF
#00FFFF
00FFFF77
Sortie aire de jeux:
la source
La façon la plus simple d'ajouter des couleurs par programmation est d'utiliser ColorLiteral .
Ajoutez simplement la propriété ColorLiteral comme indiqué dans l'exemple, Xcode vous demandera une liste complète de couleurs que vous pouvez choisir. L'avantage est de réduire le code, d' ajouter des valeurs HEX ou RVB . Vous obtiendrez également les couleurs récemment utilisées dans le storyboard.
Exemple: self.view.backgroundColor = ColorLiteral
la source
L'avertissement "'scanHexInt32' était obsolète dans iOS 13.0" a été corrigé.
L'exemple doit fonctionner sur Swift2.2 et supérieur (Swift2.x, Swift3.x, Swift4.x, Swift5.x):
Utilisez-les comme ci-dessous:
la source
Cette réponse montre comment le faire dans Obj-C. Le pont est à utiliser
la source
J'ai fusionné quelques idées de ce fil de réponses et l'ai mis à jour pour iOS 13 et Swift 5 .
Vous pouvez ensuite l'utiliser comme ceci:
la source
Swift 5: Vous pouvez créer des couleurs dans Xcode comme expliqué dans les deux images suivantes:
Vous devez nommer la couleur car vous référencez la couleur par son nom. Comme le montre l'image 2:
la source
Une autre méthode
Swift 3.0
Écrire une extension pour UIColor
vous pouvez créer directement UIColor avec hex comme ceci
la source
Dernière version de swift3
Utilisez dans votre classe ou partout où vous avez converti en hexcolor en uicolor comme de cette façon
la source
Voici ce que j'utilise. Fonctionne avec des chaînes de couleurs de 6 et 8 caractères, avec ou sans le symbole #. La valeur par défaut est noire dans la version et se bloque dans le débogage lorsqu'elle est initialisée avec une chaîne non valide.
Usage:
la source
Voici une extension Swift
UIColor
qui prend une chaîne hexadécimale:la source
Comment utiliser
la source
Hex avec validation
Détails
Solution
Usage
la source
NSPredicate
seulement besoin de tester des expressions régulières.string.range(of: pattern, options: .regularExpression)
fonctionne aussi.Vous pouvez l'utiliser dans swift 5
SWIFT 5
la source
Extension de couleur simple pour Swift 5 / SwiftUI
Exemple:
Code:
la source
Swift 2.0:
Dans viewDidLoad ()
la source
Swift 5
Appelez en utilisant UIColor (hexString: "votre chaîne hexadécimale")
la source
Prise en charge de 7 types de couleurs Hex
Il existe 7 formats de couleur hexadécimaux: "" # FF0000 "," 0xFF0000 "," FF0000 "," F00 "," red ", 0x00FF00, 16711935
ATTENTION: Ce n'est pas une "solution à un fichier", il existe certaines dépendances, mais les rechercher peut être plus rapide que de rechercher cela à partir de zéro.
https://github.com/eonist/swift-utils/blob/2882002682c4d2a3dc7cb3045c45f66ed59d566d/geom/color/NSColorParser.swift
Permalien:
https://github.com/eonist/Element/wiki/Progress#supporting-7-hex-color-types
la source
Swift 2.0
Le code ci-dessous est testé sur xcode 7.2
la source
Swift 2.0:
Faites une extension de UIColor.
Usage:
la source
Pour swift 3
la source
Vous pouvez utiliser cette extension sur UIColor qui convertit votre chaîne (hexadécimale, RGBA) en UIColor et vice versa.
la source
Extension UIColor, cela vous aidera grandement! (version: Swift 4.0 )
la source
Version RGBA Swift 3/4
J'aime la réponse de @ Luca car je pense que c'est la plus élégante.
Cependant, je ne veux pas que mes couleurs soient spécifiées dans ARGB . Je préfère RGBA + également, je devais pirater dans le cas de traiter des chaînes qui spécifient 1 caractère pour chacun des canaux " #FFFA ".
Cette version ajoute également le lancement d'erreur + supprime le caractère '#' s'il est inclus dans la chaîne. Voici mon formulaire modifié pour Swift.
la source
Usage:
la source