Próbuję użyć wartości koloru heksadecymalnego w Swift, zamiast kilku standardowych, które UIColorpozwalają na użycie, ale nie mam pojęcia, jak to zrobić.
#ffffffsą w rzeczywistości 3 kolorowymi składnikami w zapisie szesnastkowym - czerwonym ff, zielonym ffi niebieskim ff. Możesz zapisywać zapis szesnastkowy w Swift za pomocą 0xprzedrostka, np 0xFF.
#ffffffsą w rzeczywistości 3 kolorowymi składnikami w zapisie szesnastkowym - czerwonym ff, zielonym ffi niebieskim ff. Możesz zapisywać zapis szesnastkowy w Swift za pomocą 0xprzedrostka, np0xFF
Aby uprościć konwersję, utwórzmy inicjator, który przyjmuje wartości całkowite (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)}}
Stosowanie:
let color =UIColor(red:0xFF, green:0xFF, blue:0xFF)let color2=UIColor(rgb:0xFFFFFF)
Jak zdobyć alfa?
W zależności od przypadku użycia możesz po prostu użyć UIColor.withAlphaComponentmetody natywnej , np
let semitransparentBlack =UIColor(rgb:0x000000).withAlphaComponent(0.5)
Lub możesz dodać dodatkowy (opcjonalny) parametr do powyższych metod:
Świetne rozwiązanie! Dlaczego, u licha , Apple nie miałoby już czegoś takiego ????
Oliver Spryn
1
@ plik_konieczny Nie, ponieważ to nie jest ustandaryzowane. Alfa może być pierwszym składnikiem lub ostatnim. Jeśli potrzebujesz alfa, po prostu dodaj jeden parametralpha
@Hlung i @ethanstrider wygląda na to, że nawet nie pozwalają ci countteraz zrobić, zamiast countElementsjakiegoś pojęcia, czego chcą od nas użyć?
SRMR
2
Zmienił ten wiersz kodu cString = cString.substringFromIndex(advance(cString.startIndex, 1))do cString = cString.substringFromIndex(cString.startIndex.advancedBy(1))Swift 2.2 Xcode 7.3
jaytrixz
1
Jeśli nadal obsługujesz iPhone'a 5 lub 32-bitowe urządzenia przed iOS 11, nastąpi awaria. Trzeba zmienić UInt32, abyUInt64
Kegham K.
1
Xcode 11 i iOS13 SDK są przestarzałe scanHexInt32. Zamiast tego użyj UInt64a scanHexInt64.
Adam Waite,
190
Rozszerzenie 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)}}
Zastosowanie :
let darkGrey =UIColor(hexString:"#757575")
Wersja 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)}}
To moja ulubiona implementacja ze względu na sposób, w jaki obsługuje 3 przypadki. Ale wolę domyślne: wielkość liter zwraca zero, zamiast białego.
Richard Venable
Nawiasem mówiąc, domyślnym przypadkiem w tej implementacji wydaje się być UIColor.yellow ()
Gui Moura
Wiem, jak go używać i działa jak urok. Ale tak naprawdę nie rozumiem dlaczego. Może ktoś może dać mi wyjaśnienie lub dobre linki / słowa do wyszukiwania?
kuzdu
2
To nie działa poprawnie z wartościami alfa. np. oba wejścia „ff00ff00” i „# ff00ff00” będą generować RGBA 0 1 0 1. (Powinno to być 1 0 1 0). Wpis „# ff00ff” daje 1 0 1 1, co jest poprawne. (Xcode 8.2.1, iOS 9.3.)
Womble
2
@Womble pierwszym składnikiem jest alfa, a nie ostatni. Więc „# ff00ff00” ma alfa 1 z powodu „ff” na początku. Myślę, że miałeś na myśli „# 00ff00ff”. Kolejny przykład: „# ff00ff00” to kolor zielony z alfa 1, „# 0000ff00” to kolor zielony z alfa 0
Moim skromnym zdaniem uznałem to za najłatwiejsze w użyciu i bardzo jasne w porównaniu do innych odpowiedzi.
thandasoru
1
Jak poradziłbyś sobie z 123ABC? Kompilator pęka, gdy nie jest cyfrą.
Islam Q.
1
dla kompletności: let foo: Int = 0x123ABC- zanotuj „0x”
Carsten
Niestety, podobnie jak wiele innych konwerterów szesnastkowych, nie obsługuje składników alfa. Na przykład nie można uzyskać z niego wartości UIColor.clear.
Womble,
1
Chociaż nie obsługuje alpha @Womble, dodanie go jest banalne. Musiałem ustawić wyraźny typ „komponentów”, aby kompilator Swift nie „trwał zbyt długo” i się poddawał.
Norman
43
Swift 4 : Łączenie odpowiedzi Sulthana i Lucy Torelli:
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
)}}
Przykłady użycia:
let myColor =UIColor(hexFromString:"4F9BF5")let myColor =UIColor(hexFromString:"#4F9BF5")let myColor =UIColor(hexFromString:"#4F9BF5", alpha:0.5)
Najprostszym sposobem na programowe dodanie koloru jest użycie ColorLiteral .
Wystarczy dodać właściwość ColorLiteral, jak pokazano w przykładzie, Xcode wyświetli całą listę kolorów, które możesz wybrać. Zaletą tego jest mniejszy kod, dodawanie wartości HEX lub RGB . Otrzymasz również ostatnio używane kolory z serii ujęć.
„scanHexInt32” został uznany za przestarzały w iOS 13.0
Dimitar Stefanovski
@Dimitar Stefanovski Naprawiłem to.
Raniys
15
Ta odpowiedź pokazuje, jak to zrobić w Obj-C. Most ma być używany
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)
Nie zdawałem sobie sprawy, że można zdefiniować kolory jako Zasoby. Naprawdę się cieszę, że znalazłem tę odpowiedź!
Justyn
6
Inna metoda
Swift 3.0
Napisz rozszerzenie dla 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)}}
możesz bezpośrednio utworzyć UIColor z szesnastką w ten sposób
let carrot =UIColor.uicolorFromHex(0xe67e22, alpha:1))
Oto czego używam. Działa z ciągami kolorów 6 i 8 znaków, z lub bez symbolu #. Domyślnie jest czarny w wydaniu i ulega awarii podczas debugowania, gdy jest inicjowany niepoprawnym łańcuchem.
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)}}
Oto rozszerzenie Swift, UIColorktóre pobiera ciąg szesnastkowy:
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}}
Stosowanie:
//Hex to Color
let countPartColor =UIColor(hexString:"E43038")//Color to Hex
let colorHexString =UIColor(red:228, green:48, blue:56, alpha:1.0).toHexString()
Podoba mi się odpowiedź @ Lucy, ponieważ uważam, że jest najbardziej elegancka.
Jednak nie chcę, aby moje kolory były określone w ARGB . Wolę RGBA + również musiałem włamać się w przypadku łańcuchów, które określają 1 znak dla każdego kanału „ #FFFA ”.
Ta wersja dodaje także zgłaszanie błędów + usuwa znak „#”, jeśli jest zawarty w ciągu. Oto moja zmodyfikowana forma dla 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ą w rzeczywistości 3 kolorowymi składnikami w zapisie szesnastkowym - czerwonymff
, zielonymff
i niebieskimff
. Możesz zapisywać zapis szesnastkowy w Swift za pomocą0x
przedrostka, np0xFF
.Odpowiedzi:
#ffffff
są w rzeczywistości 3 kolorowymi składnikami w zapisie szesnastkowym - czerwonymff
, zielonymff
i niebieskimff
. Możesz zapisywać zapis szesnastkowy w Swift za pomocą0x
przedrostka, np0xFF
Aby uprościć konwersję, utwórzmy inicjator, który przyjmuje wartości całkowite (0–255):
Stosowanie:
Jak zdobyć alfa?
W zależności od przypadku użycia możesz po prostu użyć
UIColor.withAlphaComponent
metody natywnej , npLub możesz dodać dodatkowy (opcjonalny) parametr do powyższych metod:
(nie możemy nazwać parametru z
alpha
powodu kolizji nazwy z istniejącym inicjatorem).Nazywany jako:
Aby uzyskać wartość alfa jako liczbę całkowitą 0–255, możemy
Nazywany jako
Lub kombinacja poprzednich metod. Nie ma absolutnie żadnej potrzeby używania ciągów.
źródło
alpha
Jest to funkcja, która pobiera ciąg szesnastkowy i zwraca kolor UIColor.
(Możesz wprowadzić ciągi szesnastkowe w dowolnym formacie:
#ffffff
lubffffff
)Stosowanie:
Swift 5: (Swift 4+)
Swift 3:
Swift 2:
Źródło: arshad / gist: de147c42d7b3063ef7bc
Edycja: zaktualizowałem kod. Dzięki, Hlung, jaytrixz, Ahmad F, Kegham K i Adam Waite!
źródło
countelements
jest teraz tylkocount
:)count
teraz zrobić, zamiastcountElements
jakiegoś pojęcia, czego chcą od nas użyć?cString = cString.substringFromIndex(advance(cString.startIndex, 1))
docString = cString.substringFromIndex(cString.startIndex.advancedBy(1))
Swift 2.2 Xcode 7.3UInt32
, abyUInt64
scanHexInt32
. Zamiast tego użyjUInt64
ascanHexInt64
.Rozszerzenie UIColor Swift 5 (Swift 4, Swift 3) :
Zastosowanie :
Wersja Swift 2.x :
źródło
UIColor
:CGColor
:Stosowanie
źródło
let foo: Int = 0x123ABC
- zanotuj „0x”Swift 4 : Łączenie odpowiedzi Sulthana i Lucy Torelli:
Przykłady użycia:
źródło
Dzięki Swift 2.0 i Xcode 7.0.1 możesz utworzyć tę funkcję:
a następnie użyj go w ten sposób:
Zaktualizowano dla Swift 4
źródło
Swift 5.1: Obsługa nazw kolorów heksadecymalnych i CSS poprzez UIColor
Kod źródłowy
Szybki pakiet
Przykładowe ciągi:
Orange
,Lime
,Tomato
, Itd.Clear
,Transparent
,nil
, A pusty wydajność łańcuch[UIColor clearColor]
abc
abc7
#abc7
00FFFF
#00FFFF
00FFFF77
Wyjście z placu zabaw:
źródło
Najprostszym sposobem na programowe dodanie koloru jest użycie ColorLiteral .
Wystarczy dodać właściwość ColorLiteral, jak pokazano w przykładzie, Xcode wyświetli całą listę kolorów, które możesz wybrać. Zaletą tego jest mniejszy kod, dodawanie wartości HEX lub RGB . Otrzymasz również ostatnio używane kolory z serii ujęć.
Przykład: self.view.backgroundColor = ColorLiteral
źródło
Ostrzeżenie „Naprawiono przestarzałe narzędzie scanHexInt32 w iOS 13.0”.
Przykład powinien działać na Swift2.2 i nowszych wersjach (Swift2.x, Swift3.x, Swift4.x, Swift5.x):
Używaj ich jak poniżej:
źródło
Ta odpowiedź pokazuje, jak to zrobić w Obj-C. Most ma być używany
źródło
Połączyłem kilka pomysłów z tego wątku odpowiedzi i zaktualizowałem go dla iOS 13 i Swift 5 .
Następnie możesz użyć go w następujący sposób:
źródło
Swift 5: Możesz tworzyć kolory w Xcode, jak wyjaśniono na dwóch poniższych obrazach:
Powinieneś nazwać kolor, ponieważ odwołujesz się do koloru po nazwie. Jak pokazano na obrazku 2:
źródło
Inna metoda
Swift 3.0
Napisz rozszerzenie dla UIColor
możesz bezpośrednio utworzyć UIColor z szesnastką w ten sposób
źródło
Najnowsza wersja swift3
Użyj w swojej klasie lub w dowolnym miejscu, w którym zamieniłeś heksokolor na uicolor, jak w ten sposób
źródło
Oto czego używam. Działa z ciągami kolorów 6 i 8 znaków, z lub bez symbolu #. Domyślnie jest czarny w wydaniu i ulega awarii podczas debugowania, gdy jest inicjowany niepoprawnym łańcuchem.
Stosowanie:
źródło
Oto rozszerzenie Swift,
UIColor
które pobiera ciąg szesnastkowy:źródło
Jak używać
źródło
Heks z walidacją
Detale
Rozwiązanie
Stosowanie
źródło
NSPredicate
tylko testować wyrażeń regularnych.string.range(of: pattern, options: .regularExpression)
też działa.Możesz go użyć w swift 5
SWIFT 5
źródło
Swift 2.0:
In viewDidLoad ()
źródło
Szybki 5
Wywoływanie za pomocą UIColor (hexString: „Twój ciąg hex”)
źródło
Proste rozszerzenie kolorów dla Swift 5 / SwiftUI
Przykład:
Kod:
źródło
Obsługuje 7 typów kolorów Hex
Dostępnych jest 7 formatów heksadecymalnych: „” # FF0000 ”,„ 0xFF0000 ”,„ FF0000 ”,„ F00 ”,„ czerwony ”, 0x00FF00, 16711935
UWAGA: To nie jest rozwiązanie „jednego pliku”, istnieją pewne zależności, ale ich odnalezienie może być szybsze niż badanie tego od zera.
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
źródło
Swift 2.0
Poniższy kod jest testowany na xcode 7.2
źródło
Swift 2.0:
Stwórz rozszerzenie UIColor.
Stosowanie:
źródło
Dla szybkiego 3
źródło
Możesz użyć tego rozszerzenia w UIColor, które konwertuje Twój ciąg (szesnastkowy, RGBA) na UIColor i odwrotnie.
źródło
Rozszerzenie UIColor, to bardzo Ci pomoże! (wersja :Swift 4.0 )
źródło
Wersja RGBA Swift 3/4
Podoba mi się odpowiedź @ Lucy, ponieważ uważam, że jest najbardziej elegancka.
Jednak nie chcę, aby moje kolory były określone w ARGB . Wolę RGBA + również musiałem włamać się w przypadku łańcuchów, które określają 1 znak dla każdego kanału „ #FFFA ”.
Ta wersja dodaje także zgłaszanie błędów + usuwa znak „#”, jeśli jest zawarty w ciągu. Oto moja zmodyfikowana forma dla Swift.
źródło
Stosowanie:
źródło