Saya mencoba menggunakan nilai warna hex di Swift, bukan beberapa yang standar yang UIColormemungkinkan Anda untuk menggunakan, tetapi saya tidak tahu bagaimana melakukannya.
#ffffffsebenarnya 3 komponen warna dalam notasi heksadesimal - merah ff, hijau ffdan biru ff. Anda dapat menulis notasi heksadesimal di Swift menggunakan 0xawalan, mis 0xFF.
#ffffffsebenarnya 3 komponen warna dalam notasi heksadesimal - merah ff, hijau ffdan biru ff. Anda dapat menulis notasi heksadesimal di Swift menggunakan 0xawalan, mis0xFF
Untuk menyederhanakan konversi, mari buat penginisialisasi yang mengambil nilai integer (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)}}
Pemakaian:
let color =UIColor(red:0xFF, green:0xFF, blue:0xFF)let color2=UIColor(rgb:0xFFFFFF)
Bagaimana cara mendapatkan alpha?
Tergantung pada kasus penggunaan Anda, Anda dapat menggunakan UIColor.withAlphaComponentmetode asli , misalnya
let semitransparentBlack =UIColor(rgb:0x000000).withAlphaComponent(0.5)
Atau Anda dapat menambahkan parameter (opsional) tambahan untuk metode di atas:
Solusi hebat! Mengapa di bumi tidak akan Apel sudah memiliki sesuatu seperti ini ????
Oliver Spryn
1
@ confile Tidak, karena itu tidak standar. Alpha dapat menjadi komponen pertama atau yang terakhir. Jika Anda membutuhkan alpha, tambahkan saja satu parameteralpha
@Hlung dan @ethanstrider sepertinya mereka bahkan tidak membiarkan Anda melakukannya countsekarang countElements, tidak tahu apa yang mereka ingin kita gunakan?
SRMR
2
Mengubah baris kode ini cString = cString.substringFromIndex(advance(cString.startIndex, 1))menjadi cString = cString.substringFromIndex(cString.startIndex.advancedBy(1))untuk Swift 2.2 Xcode 7.3
jaytrixz
1
Jika Anda masih mendukung iPhone 5 atau perangkat 32 bit apa pun sebelum iOS 11, itu akan macet. Anda perlu mengubah UInt32keUInt64
Kegham K.
1
Xcode 11 dan iOS13 SDK sudah usang scanHexInt32. Gunakan a UInt64dan scanHexInt64sebagai gantinya.
Adam Waite
190
Ekstensi 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)}}
Penggunaan :
let darkGrey =UIColor(hexString:"#757575")
Versi 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)}}
Ini adalah implementasi favorit saya karena cara menangani 3 kasus. Tapi saya lebih suka default: case untuk mengembalikan nil, bukan putih.
Richard Venable
omong-omong, kasus default dalam implementasi ini tampaknya menjadi UIColor.yellow ()
Gui Moura
Saya tahu cara menggunakannya dan itu berfungsi seperti pesona. Tapi saya tidak begitu mengerti mengapa. Mungkin seseorang dapat memberi saya penjelasan atau tautan / kata-kata yang bagus untuk dicari?
kuzdu
2
Ini tidak berfungsi dengan benar dengan nilai alpha. mis. Kedua input "ff00ff00" dan "# ff00ff00" akan menampilkan RGBA dari 0 1 0 1. (Seharusnya 1 0 1 0). Input "# ff00ff" menghasilkan 1 0 1 1, yang benar. (Xcode 8.2.1, iOS 9.3.)
Womble
2
@ Menggabungkan komponen pertama adalah alpha bukan yang terakhir. Jadi "# ff00ff00" memiliki alpha 1 karena "ff" di awal. Saya pikir Anda berarti "# 00ff00ff". Contoh lain: "# ff00ff00" ini berwarna hijau dengan alpha 1, "# 0000ff00" ini berwarna hijau dengan alpha 0
Menurut pendapat saya yang sederhana, saya menemukan ini yang paling mudah digunakan dan sangat jelas dibandingkan dengan jawaban lain.
thandasoru
1
Bagaimana Anda menangani 123ABC? Compiler sedang bersedih karena itu bukan angka.
Islam Q.
1
untuk kelengkapan: let foo: Int = 0x123ABC- perhatikan '0x'
Carsten
Sayangnya, seperti banyak konverter hex lainnya, ini tidak menangani komponen alpha. Jadi, misalnya, Anda tidak bisa mendapatkan nilai UIColor.clear darinya.
Womble
1
Meskipun tidak menangani alfa @ Womble, itu sepele untuk ditambahkan. Saya harus menetapkan tipe eksplisit untuk "komponen" untuk mencegah kompiler Swift dari "terlalu lama" dan menyerah.
Norman
43
Swift 4 : Menggabungkan jawaban Sulthan dan 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
)}}
Contoh penggunaan:
let myColor =UIColor(hexFromString:"4F9BF5")let myColor =UIColor(hexFromString:"#4F9BF5")let myColor =UIColor(hexFromString:"#4F9BF5", alpha:0.5)
Cara paling sederhana untuk menambahkan warna secara pemrograman adalah dengan menggunakan ColorLiteral .
Cukup tambahkan properti ColorLiteral seperti yang ditunjukkan dalam contoh, Xcode akan meminta Anda dengan seluruh daftar warna yang dapat Anda pilih. Keuntungan melakukannya adalah kode yang lebih rendah, tambahkan nilai HEX atau RGB . Anda juga akan mendapatkan warna yang baru saja digunakan dari storyboard.
'scanHexInt32' sudah tidak digunakan lagi di iOS 13.0
Dimitar Stefanovski
@Dimitar Stefanovski Saya sudah memperbaikinya.
Raniys
15
Jawaban ini menunjukkan bagaimana melakukannya di Obj-C. Jembatan akan digunakan
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)
Saya tidak menyadari Anda bisa mendefinisikan warna sebagai Aset. Sangat senang saya menemukan jawaban ini!
Justyn
6
Metode lain
Swift 3.0
Tulis ekstensi untuk 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)}}
Anda dapat langsung membuat UIColor dengan hex seperti ini
let carrot =UIColor.uicolorFromHex(0xe67e22, alpha:1))
Inilah yang saya gunakan. Bekerja dengan string warna 6 dan 8 karakter, dengan atau tanpa simbol #. Default menjadi hitam dalam rilis dan macet di debug saat diinisialisasi dengan string yang tidak valid.
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)}}
Berikut ini ekstensi Swift UIColoryang menggunakan string hex:
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}}
Pemakaian:
//Hex to Color
let countPartColor =UIColor(hexString:"E43038")//Color to Hex
let colorHexString =UIColor(red:228, green:48, blue:56, alpha:1.0).toHexString()
Saya suka jawaban Luca karena saya pikir itu yang paling elegan.
Namun saya tidak ingin warna saya ditentukan dalam ARGB . Saya lebih suka RGBA + juga saya perlu meretas jika berurusan dengan string yang menentukan 1 karakter untuk masing-masing saluran " #FFFA ".
Versi ini juga menambahkan kesalahan melempar + menghapus karakter '#' jika itu termasuk dalam string. Ini formulir saya yang dimodifikasi untuk 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
sebenarnya 3 komponen warna dalam notasi heksadesimal - merahff
, hijauff
dan biruff
. Anda dapat menulis notasi heksadesimal di Swift menggunakan0x
awalan, mis0xFF
.Jawaban:
#ffffff
sebenarnya 3 komponen warna dalam notasi heksadesimal - merahff
, hijauff
dan biruff
. Anda dapat menulis notasi heksadesimal di Swift menggunakan0x
awalan, mis0xFF
Untuk menyederhanakan konversi, mari buat penginisialisasi yang mengambil nilai integer (0 - 255):
Pemakaian:
Bagaimana cara mendapatkan alpha?
Tergantung pada kasus penggunaan Anda, Anda dapat menggunakan
UIColor.withAlphaComponent
metode asli , misalnyaAtau Anda dapat menambahkan parameter (opsional) tambahan untuk metode di atas:
(kami tidak dapat memberi nama parameter
alpha
karena tabrakan nama dengan initializer yang ada).Disebut sebagai:
Untuk mendapatkan alfa sebagai integer 0-255, kita bisa
Disebut sebagai
Atau kombinasi dari metode sebelumnya. Sama sekali tidak perlu menggunakan string.
sumber
alpha
Ini adalah fungsi yang mengambil string hex dan mengembalikan UIColor.
(Anda dapat memasukkan string hex dengan format:
#ffffff
atauffffff
)Pemakaian:
Swift 5: (Swift 4+)
Swift 3:
Swift 2:
Sumber: arshad / inti: de147c42d7b3063ef7bc
Edit: Memperbarui kode. Terima kasih, Hlung, jaytrixz, Ahmad F, Kegham K, dan Adam Waite!
sumber
countelements
sekarang hanyacount
:)count
sekarangcountElements
, tidak tahu apa yang mereka ingin kita gunakan?cString = cString.substringFromIndex(advance(cString.startIndex, 1))
menjadicString = cString.substringFromIndex(cString.startIndex.advancedBy(1))
untuk Swift 2.2 Xcode 7.3UInt32
keUInt64
scanHexInt32
. Gunakan aUInt64
danscanHexInt64
sebagai gantinya.Ekstensi UIColor Swift 5 (Swift 4, Swift 3) :
Penggunaan :
Versi Swift 2.x :
sumber
UIColor
:CGColor
:Pemakaian
sumber
let foo: Int = 0x123ABC
- perhatikan '0x'Swift 4 : Menggabungkan jawaban Sulthan dan Luca Torella:
Contoh penggunaan:
sumber
Dengan Swift 2.0 dan Xcode 7.0.1 Anda dapat membuat fungsi ini:
dan kemudian menggunakannya dengan cara ini:
Diperbarui Untuk Swift 4
sumber
Swift 5.1: Dukungan nama warna Hex dan CSS melalui UIColor
Kode intinya
Paket Cepat
Contoh string:
Orange
,Lime
,Tomato
, DllClear
,Transparent
,nil
, Dan hasil string kosong[UIColor clearColor]
abc
abc7
#abc7
00FFFF
#00FFFF
00FFFF77
Output taman bermain:
sumber
Cara paling sederhana untuk menambahkan warna secara pemrograman adalah dengan menggunakan ColorLiteral .
Cukup tambahkan properti ColorLiteral seperti yang ditunjukkan dalam contoh, Xcode akan meminta Anda dengan seluruh daftar warna yang dapat Anda pilih. Keuntungan melakukannya adalah kode yang lebih rendah, tambahkan nilai HEX atau RGB . Anda juga akan mendapatkan warna yang baru saja digunakan dari storyboard.
Contoh: self.view.backgroundColor = ColorLiteral
sumber
Peringatan "'scanHexInt32' sudah tidak digunakan lagi di iOS 13.0" telah diperbaiki.
Sampel harus bekerja pada Swift2.2 dan di atasnya (Swift2.x, Swift3.x, Swift4.x, Swift5.x):
Gunakan seperti di bawah ini:
sumber
Jawaban ini menunjukkan bagaimana melakukannya di Obj-C. Jembatan akan digunakan
sumber
Saya telah menggabungkan beberapa ide dari utas jawaban ini dan memutakhirkannya untuk iOS 13 & Swift 5 .
Anda kemudian dapat menggunakannya seperti ini:
sumber
Swift 5: Anda dapat membuat warna dalam Xcode seperti dijelaskan dalam dua gambar berikut:
Anda harus memberi nama warna karena Anda merujuk warna dengan nama. Seperti yang ditunjukkan pada gambar 2:
sumber
Metode lain
Swift 3.0
Tulis ekstensi untuk UIColor
Anda dapat langsung membuat UIColor dengan hex seperti ini
sumber
Versi swift3 terbaru
Gunakan di kelas Anda atau di mana pun Anda mengubahnya menjadi hexcolor menjadi uicolor seperti dengan cara ini
sumber
Inilah yang saya gunakan. Bekerja dengan string warna 6 dan 8 karakter, dengan atau tanpa simbol #. Default menjadi hitam dalam rilis dan macet di debug saat diinisialisasi dengan string yang tidak valid.
Pemakaian:
sumber
Berikut ini ekstensi Swift
UIColor
yang menggunakan string hex:sumber
Cara Penggunaan
sumber
Hex dengan validasi
Detail
Larutan
Pemakaian
sumber
NSPredicate
hanya menguji ekspresi reguler.string.range(of: pattern, options: .regularExpression)
bekerja juga.Anda dapat menggunakannya dalam cepat 5
SWIFT 5
sumber
Ekstensi Warna Sederhana untuk Swift 5 / SwiftUI
Contoh:
Kode:
sumber
Swift 2.0:
Di viewDidLoad ()
sumber
Cepat 5
Panggilan menggunakan UIColor (hexString: "string hex Anda")
sumber
Mendukung 7 jenis warna Hex
Ada 7 format warna hex: "" # FF0000 "," 0xFF0000 "," FF0000 "," F00 "," red ", 0x00FF00, 16711935
PERHATIAN: Ini bukan "solusi satu file", ada beberapa dependensi, tetapi memburu mereka mungkin lebih cepat daripada meneliti ini dari awal.
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
sumber
Swift 2.0
Kode di bawah ini diuji pada xcode 7.2
sumber
Swift 2.0:
Buat ekstensi UIColor.
Pemakaian:
sumber
Untuk cepat 3
sumber
Anda dapat menggunakan ekstensi ini pada UIColor yang mengubah String Anda (Heksadesimal, RGBA) ke UIColor dan sebaliknya.
sumber
Ekstensi UIColor, Ini akan sangat membantu Anda! (versi :Swift 4.0 )
sumber
Versi RGBA Swift 3/4
Saya suka jawaban Luca karena saya pikir itu yang paling elegan.
Namun saya tidak ingin warna saya ditentukan dalam ARGB . Saya lebih suka RGBA + juga saya perlu meretas jika berurusan dengan string yang menentukan 1 karakter untuk masing-masing saluran " #FFFA ".
Versi ini juga menambahkan kesalahan melempar + menghapus karakter '#' jika itu termasuk dalam string. Ini formulir saya yang dimodifikasi untuk Swift.
sumber
Pemakaian:
sumber