Ich versuche, Hex-Farbwerte in Swift anstelle der wenigen Standardwerte zu verwenden, UIColordie Sie verwenden können, aber ich habe keine Ahnung, wie das geht.
Beispiel: Wie würde ich #ffffffals Farbe verwenden?
#ffffffsind eigentlich 3 Farbkomponenten in hexadezimaler Notation - rot ff, grün ffund blau ff. Sie können in Swift eine hexadezimale Notation mit dem 0xPräfix schreiben , z 0xFF.
#ffffffsind eigentlich 3 Farbkomponenten in hexadezimaler Notation - rot ff, grün ffund blau ff. Sie können in Swift eine hexadezimale Notation mit dem 0xPräfix schreiben , z0xFF
Um die Konvertierung zu vereinfachen, erstellen wir einen Initialisierer, der ganzzahlige (0 - 255) Werte annimmt:
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)}}
Verwendungszweck:
let color =UIColor(red:0xFF, green:0xFF, blue:0xFF)let color2=UIColor(rgb:0xFFFFFF)
Wie bekomme ich Alpha?
Abhängig von Ihrem Anwendungsfall können Sie einfach die native UIColor.withAlphaComponentMethode verwenden, z
let semitransparentBlack =UIColor(rgb:0x000000).withAlphaComponent(0.5)
Oder Sie können den oben genannten Methoden einen zusätzlichen (optionalen) Parameter hinzufügen:
Tolle Lösung! Warum um alles in der Welt hätte Apple so etwas nicht schon ????
Oliver Spryn
1
@confile Nein, weil das nicht standardisiert ist. Alpha kann die erste oder die letzte Komponente sein. Wenn Sie Alpha benötigen, fügen Sie einfach einen Parameter hinzualpha
Warum nicht UInt8 verwenden, anstatt zu behaupten, dass Ihre Ints im Bereich von 0 bis 255 liegen?
Richard Venable
5
Es ist 2017 und Apple hat so etwas noch nicht.
AnBisw
351
Dies ist eine Funktion, die eine Hex-Zeichenfolge verwendet und eine UIColor zurückgibt. (Sie können Hex-Zeichenfolgen in folgenden Formaten eingeben: #ffffffoder ffffff)
@Hlung und @ethanstrider es sieht so aus, als würden sie dich countjetzt nicht einmal machen lassen, anstatt countElementseine Idee zu haben, was sie von uns wollen?
SRMR
2
Diese Codezeile wurde cString = cString.substringFromIndex(advance(cString.startIndex, 1))in cString = cString.substringFromIndex(cString.startIndex.advancedBy(1))Swift 2.2 Xcode 7.3
jaytrixz
1
Wenn Sie vor iOS 11 noch iPhone 5 oder 32-Bit-Geräte unterstützen, stürzt das Gerät ab. Sie müssen das ändern UInt32zuUInt64
Kegham K.
1
Xcode 11 und das iOS13 SDK sind veraltet scanHexInt32. Verwenden Sie stattdessen ein UInt64und scanHexInt64.
Adam Waite
190
Swift 5 (Swift 4, Swift 3) UIColor-Erweiterung:
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)}}
Verwendung :
let darkGrey =UIColor(hexString:"#757575")
Swift 2.x Version:
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)}}
Dies ist meine Lieblingsimplementierung, da sie die drei Fälle behandelt. Aber ich bevorzuge die Standardeinstellung: case, um null anstelle von weiß zurückzugeben.
Richard Venable
Übrigens scheint der Standardfall in dieser Implementierung UIColor.yellow ()
Gui Moura
Ich weiß, wie man es benutzt und es funktioniert wie ein Zauber. Aber ich verstehe nicht wirklich warum. Vielleicht kann mir jemand eine Erklärung oder ein paar gute Links / Wörter zum Suchen geben?
Kuzdu
2
Dies funktioniert mit Alpha-Werten nicht richtig. zB Beide Eingänge "ff00ff00" und "# ff00ff00" geben einen RGBA von 0 1 0 1 aus. (Es sollte 1 0 1 0 sein). Die Eingabe "# ff00ff" ergibt 1 0 1 1, was korrekt ist. (Xcode 8.2.1, iOS 9.3.)
Womble
2
@ Womble die erste Komponente ist das Alpha, nicht die letzte. "# Ff00ff00" hat also Alpha 1 wegen des "ff" am Anfang. Ich denke du meintest "# 00ff00ff". Ein weiteres Beispiel: "# ff00ff00" Dies ist grün mit Alpha 1, "# 0000ff00" Dies ist grün mit Alpha 0
Meiner bescheidenen Meinung nach fand ich dies am einfachsten zu bedienen und im Vergleich zu anderen Antworten sehr klar.
Thandasoru
1
Wie würden Sie mit 123ABC umgehen? Der Compiler macht sich Sorgen, dass es sich nicht um eine Ziffer handelt.
Islam Q.
1
Der Vollständigkeit let foo: Int = 0x123ABChalber : - Beachten Sie die '0x'
Carsten
Leider behandelt dies, wie viele andere Hex-Konverter, keine Alpha-Komponenten. So können Sie beispielsweise keinen UIColor.clear-Wert daraus abrufen.
Womble
1
Alpha @Womble wird zwar nicht verarbeitet, das Hinzufügen ist jedoch trivial. Ich musste einen expliziten Typ für "Komponenten" festlegen, um zu verhindern, dass der Swift-Compiler "zu lange dauert" und aufgibt.
Norman
43
Swift 4 : Kombinieren Sie die Antworten von Sulthan und 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
)}}
Anwendungsbeispiele:
let myColor =UIColor(hexFromString:"4F9BF5")let myColor =UIColor(hexFromString:"#4F9BF5")let myColor =UIColor(hexFromString:"#4F9BF5", alpha:0.5)
Der einfachste Weg, Farbe programmgesteuert hinzuzufügen, ist die Verwendung von ColorLiteral .
Fügen Sie einfach die Eigenschaft ColorLiteral hinzu, wie im Beispiel gezeigt. Xcode fordert Sie mit einer ganzen Liste von Farben auf, die Sie auswählen können. Dies hat den Vorteil, dass weniger Code, HEX-Werte oder RGB hinzugefügt werden . Sie erhalten auch die kürzlich verwendeten Farben aus dem Storyboard.
Diese Antwort zeigt, wie es in Obj-C geht. Die Brücke ist zu benutzen
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)
Ich wusste nicht, dass man Farben als Assets definieren kann. Wirklich froh, dass ich diese Antwort gefunden habe!
Justyn
6
Eine andere Methode
Swift 3.0
Schreiben Sie eine Erweiterung für 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)}}
Sie können UIColor direkt mit Hex wie diesem erstellen
let carrot =UIColor.uicolorFromHex(0xe67e22, alpha:1))
Hier ist was ich benutze. Funktioniert mit Farbzeichenfolgen mit 6 und 8 Zeichen, mit oder ohne # -Symbol. Der Standardwert ist in der Version schwarz und stürzt beim Debuggen ab, wenn er mit einer ungültigen Zeichenfolge initialisiert wird.
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)}}
Hier ist eine Swift-Erweiterung UIColor, die eine Hex-Zeichenfolge benötigt:
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
VORSICHT: Dies ist keine "One-File-Lösung", es gibt einige Abhängigkeiten, aber das Aufspüren kann schneller sein, als dies von Grund auf zu untersuchen.
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}}
Verwendungszweck:
//Hex to Color
let countPartColor =UIColor(hexString:"E43038")//Color to Hex
let colorHexString =UIColor(red:228, green:48, blue:56, alpha:1.0).toHexString()
Ich mag die Antwort von @ Luca, da ich denke, dass es die eleganteste ist.
Allerdings möchte ich nicht meine Farben in bestimmten ARGB . Ich würde lieber RGBA +, außerdem mussteich michhacken, wenn es um Strings ging, die 1 Zeichen für jeden der Kanäle " #FFFA " angeben .
Diese Version fügt auch Fehler beim Werfen hinzu + entfernt das Zeichen '#', wenn es in der Zeichenfolge enthalten ist. Hier ist mein modifiziertes Formular für 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
sind eigentlich 3 Farbkomponenten in hexadezimaler Notation - rotff
, grünff
und blauff
. Sie können in Swift eine hexadezimale Notation mit dem0x
Präfix schreiben , z0xFF
.Antworten:
#ffffff
sind eigentlich 3 Farbkomponenten in hexadezimaler Notation - rotff
, grünff
und blauff
. Sie können in Swift eine hexadezimale Notation mit dem0x
Präfix schreiben , z0xFF
Um die Konvertierung zu vereinfachen, erstellen wir einen Initialisierer, der ganzzahlige (0 - 255) Werte annimmt:
Verwendungszweck:
Wie bekomme ich Alpha?
Abhängig von Ihrem Anwendungsfall können Sie einfach die native
UIColor.withAlphaComponent
Methode verwenden, zOder Sie können den oben genannten Methoden einen zusätzlichen (optionalen) Parameter hinzufügen:
(Wir können den Parameter
alpha
aufgrund einer Namenskollision mit dem vorhandenen Initialisierer nicht benennen .)Genannt als:
Um das Alpha als Ganzzahl 0-255 zu erhalten, können wir
Genannt als
Oder eine Kombination der vorherigen Methoden. Es ist absolut nicht erforderlich, Zeichenfolgen zu verwenden.
quelle
alpha
Dies ist eine Funktion, die eine Hex-Zeichenfolge verwendet und eine UIColor zurückgibt.
(Sie können Hex-Zeichenfolgen in folgenden Formaten eingeben:
#ffffff
oderffffff
)Verwendungszweck:
Swift 5: (Swift 4+)
Swift 3:
Swift 2:
Quelle: arshad / gist: de147c42d7b3063ef7bc
Bearbeiten: Der Code wurde aktualisiert. Danke, Hlung, Jaytrixz, Ahmad F., Kegham K. und Adam Waite!
quelle
countelements
ist jetzt nurcount
:)count
jetzt nicht einmal machen lassen, anstattcountElements
eine Idee zu haben, was sie von uns wollen?cString = cString.substringFromIndex(advance(cString.startIndex, 1))
incString = cString.substringFromIndex(cString.startIndex.advancedBy(1))
Swift 2.2 Xcode 7.3UInt32
zuUInt64
scanHexInt32
. Verwenden Sie stattdessen einUInt64
undscanHexInt64
.Swift 5 (Swift 4, Swift 3) UIColor-Erweiterung:
Verwendung :
Swift 2.x Version:
quelle
UIColor
::CGColor
::Verwendungszweck
quelle
let foo: Int = 0x123ABC
halber : - Beachten Sie die '0x'Swift 4 : Kombinieren Sie die Antworten von Sulthan und Luca Torella:
Anwendungsbeispiele:
quelle
Mit Swift 2.0 und Xcode 7.0.1 können Sie diese Funktion erstellen:
und dann verwenden Sie es auf diese Weise:
Aktualisiert für Swift 4
quelle
Swift 5.1: Unterstützung von Hex- und CSS-Farbnamen über eine UIColor
Kerncode
Schnelles Paket
Beispielzeichenfolgen:
Orange
,Lime
,Tomato
Etc.Clear
,Transparent
,nil
, Und leere Zeichenfolge Ausbeute[UIColor clearColor]
abc
abc7
#abc7
00FFFF
#00FFFF
00FFFF77
Spielplatzausgabe:
quelle
Der einfachste Weg, Farbe programmgesteuert hinzuzufügen, ist die Verwendung von ColorLiteral .
Fügen Sie einfach die Eigenschaft ColorLiteral hinzu, wie im Beispiel gezeigt. Xcode fordert Sie mit einer ganzen Liste von Farben auf, die Sie auswählen können. Dies hat den Vorteil, dass weniger Code, HEX-Werte oder RGB hinzugefügt werden . Sie erhalten auch die kürzlich verwendeten Farben aus dem Storyboard.
Beispiel: self.view.backgroundColor = ColorLiteral
quelle
Die Warnung "'scanHexInt32' war in iOS 13.0 veraltet" wurde behoben.
Das Beispiel sollte unter Swift2.2 und höher funktionieren (Swift2.x, Swift3.x, Swift4.x, Swift5.x):
Verwenden Sie sie wie folgt:
quelle
Diese Antwort zeigt, wie es in Obj-C geht. Die Brücke ist zu benutzen
quelle
Ich habe einige Ideen aus diesem Antwort-Thread zusammengeführt und für iOS 13 und Swift 5 aktualisiert .
Sie können es dann folgendermaßen verwenden:
quelle
Swift 5: Sie können Farben in Xcode erstellen, wie in den folgenden beiden Bildern erläutert:
Sie sollten die Farbe benennen, da Sie die Farbe mit dem Namen referenzieren. Wie in Bild 2 gezeigt:
quelle
Eine andere Methode
Swift 3.0
Schreiben Sie eine Erweiterung für UIColor
Sie können UIColor direkt mit Hex wie diesem erstellen
quelle
Neueste swift3 Version
Verwenden Sie es in Ihrer Klasse oder wo immer Sie es auf diese Weise in Hexcolor in Uicolor umgewandelt haben
quelle
Hier ist was ich benutze. Funktioniert mit Farbzeichenfolgen mit 6 und 8 Zeichen, mit oder ohne # -Symbol. Der Standardwert ist in der Version schwarz und stürzt beim Debuggen ab, wenn er mit einer ungültigen Zeichenfolge initialisiert wird.
Verwendungszweck:
quelle
Hier ist eine Swift-Erweiterung
UIColor
, die eine Hex-Zeichenfolge benötigt:quelle
Wie benutzt man
quelle
Hex mit Validierung
Einzelheiten
Lösung
Verwendungszweck
quelle
NSPredicate
nur reguläre Ausdrücke testen.string.range(of: pattern, options: .regularExpression)
funktioniert auch.Sie können es in Swift 5 verwenden
SWIFT 5
quelle
Einfache Farberweiterung für Swift 5 / SwiftUI
Beispiel:
Code:
quelle
Swift 2.0:
In viewDidLoad ()
quelle
Swift 5
Aufruf mit UIColor (hexString: "Ihre Hex-Zeichenfolge")
quelle
Unterstützung von 7 Hex-Farbtypen
Es gibt 7 Hex-Farbformate: "# FF0000", "0xFF0000", "FF0000", "F00", "Rot", 0x00FF00, 16711935
VORSICHT: Dies ist keine "One-File-Lösung", es gibt einige Abhängigkeiten, aber das Aufspüren kann schneller sein, als dies von Grund auf zu untersuchen.
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
quelle
Swift 2.0
Der folgende Code wird auf xcode 7.2 getestet
quelle
Swift 2.0:
Machen Sie eine Erweiterung von UIColor.
Verwendungszweck:
quelle
Für schnelle 3
quelle
Sie können diese Erweiterung für UIColor verwenden, die Ihre Zeichenfolge (Hexadezimal, RGBA) in UIColor konvertiert und umgekehrt.
quelle
UIColor-Erweiterung, Dies wird Ihnen sehr helfen! (Version: Swift 4.0 )
quelle
RGBA Version Swift 3/4
Ich mag die Antwort von @ Luca, da ich denke, dass es die eleganteste ist.
Allerdings möchte ich nicht meine Farben in bestimmten ARGB . Ich würde lieber RGBA +, außerdem mussteich michhacken, wenn es um Strings ging, die 1 Zeichen für jeden der Kanäle " #FFFA " angeben .
Diese Version fügt auch Fehler beim Werfen hinzu + entfernt das Zeichen '#', wenn es in der Zeichenfolge enthalten ist. Hier ist mein modifiziertes Formular für Swift.
quelle
Verwendungszweck:
quelle