Я пытаюсь использовать шестнадцатеричные цветовые значения в Swift вместо нескольких стандартных, которые UIColorпозволяют вам использовать, но я понятия не имею, как это сделать.
Пример: как бы я использовал #ffffffв качестве цвета?
#ffffffна самом деле 3 цветовых компонента в шестнадцатеричном формате - красный ff, зеленый ffи синий ff. Вы можете написать шестнадцатеричное обозначение в Swift, используя 0xпрефикс, например 0xFF.
#ffffffна самом деле 3 цветовых компонента в шестнадцатеричном формате - красный ff, зеленый ffи синий ff. Вы можете написать шестнадцатеричное обозначение в Swift, используя 0xпрефикс, например0xFF
Чтобы упростить преобразование, давайте создадим инициализатор, который принимает целочисленные (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)}}
Использование:
let color =UIColor(red:0xFF, green:0xFF, blue:0xFF)let color2=UIColor(rgb:0xFFFFFF)
Как получить альфа?
В зависимости от вашего варианта использования вы можете просто использовать собственный UIColor.withAlphaComponentметод, например
let semitransparentBlack =UIColor(rgb:0x000000).withAlphaComponent(0.5)
Или вы можете добавить дополнительный (необязательный) параметр к вышеуказанным методам:
Отличное решение! С какой стати Apple уже не имеет что-то подобное ????
Оливер Сприн
1
@confile Нет, потому что это не стандартизировано. Альфа может быть первым компонентом или последним. Если вам нужна альфа, просто добавьте один параметрalpha
Почему бы не использовать UInt8 вместо того, чтобы утверждать, что ваши целые числа находятся в диапазоне 0 ... 255?
Ричард Венейбл
5
Сейчас 2017 год, и у Apple до сих пор нет такого.
AnBisw
351
Это функция, которая принимает шестнадцатеричную строку и возвращает UIColor. (Вы можете ввести шестнадцатеричные строки в любом формате: #ffffffили ffffff)
@Hlung и @ethanstrider похоже, что они даже не позволяют тебе countсейчас делать, а не представляют countElements, что они хотят, чтобы мы использовали?
SRMR
2
Измененный эту строку кода , cString = cString.substringFromIndex(advance(cString.startIndex, 1))чтобы cString = cString.substringFromIndex(cString.startIndex.advancedBy(1))для Swift 2.2 Xcode 7.3
jaytrixz
1
Если вы по-прежнему поддерживает iPhone 5 или любые 32-разрядные устройства до iOS 11, он будет зависать. Вам нужно изменить , UInt32чтобыUInt64
Kegham K.
1
Xcode 11 и iOS13 SDK устарели scanHexInt32. Используйте UInt64и scanHexInt64вместо.
Адам Уэйт
191
Swift 5 (Swift 4, Swift 3) 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)}}
Использование :
let darkGrey =UIColor(hexString:"#757575")
Версия 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)}}
Это моя любимая реализация из-за того, как она обрабатывает 3 случая. Но я предпочитаю значение по умолчанию: case возвращает nil вместо white.
Ричард Венейбл
Кстати, по умолчанию в этой реализации выглядит UIColor.yellow ()
Gui Moura
Я знаю, как использовать это, и это работает как шарм. Но я не очень понимаю, почему. Может быть, кто-то может дать мне объяснение или несколько хороших ссылок / слов для поиска?
Кузду
2
Это не работает правильно с альфа-значениями. Например, оба входа "ff00ff00" и "# ff00ff00" будут выдавать RGBA 0 1 0 1. (Это должно быть 1 0 1 0). Ввод "# ff00ff" приводит к 1 0 1 1, что правильно. (Xcode 8.2.1, IOS 9.3.)
Уомбл
2
@ Womble первый компонент альфа не последний. Так что «# ff00ff00» имеет альфа 1 из-за «ff» в начале. Я думаю, что вы имели в виду "# 00ff00ff". Другой пример: «# ff00ff00» это зеленый с альфа 1, «# 0000ff00» это зеленый с альфа 0
По моему скромному мнению, я нашел это самым простым в использовании и очень ясным по сравнению с другими ответами.
thandasoru
1
Как бы вы справились с 123ABC? Компилятор ругается, не будучи цифрой.
Ислам Q.
1
для полноты: let foo: Int = 0x123ABC- обратите внимание на '0x'
Карстен
Увы, как и многие другие шестнадцатеричные конвертеры, здесь не обрабатываются альфа-компоненты. Так, например, вы не можете получить значение UIColor.clear от него.
Уомбл
1
Хотя он и не обрабатывает альфу @Womble, добавить его тривиально. Мне пришлось установить явный тип для «компонентов», чтобы компилятор Swift «не занимал слишком много времени и не сдавался».
Норман,
43
Свифт 4 : Сочетание ответов Султана и Луки Тореллы:
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
)}}
Примеры использования:
let myColor =UIColor(hexFromString:"4F9BF5")let myColor =UIColor(hexFromString:"#4F9BF5")let myColor =UIColor(hexFromString:"#4F9BF5", alpha:0.5)
Самый простой способ добавить цвет программным способом - использовать ColorLiteral .
Просто добавьте свойство ColorLiteral, как показано в примере, Xcode предложит вам полный список цветов, которые вы можете выбрать. Преимущество этого состоит в уменьшении кода, добавлении значений HEX или RGB . Вы также получите недавно использованные цвета из раскадровки.
Этот ответ показывает, как это сделать в Obj-C. Мост должен использовать
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)
Я не знал, что вы можете определить цвета как активы. Очень рад, что нашел этот ответ!
Джастин
6
Другой метод
Swift 3.0
Написать расширение для 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)}}
вы можете напрямую создать UIColor с помощью hex
let carrot =UIColor.uicolorFromHex(0xe67e22, alpha:1))
Вот что я использую. Работает с цветными строками из 6 и 8 символов, с символом # или без него. По умолчанию черный в выпуске и вылетает при отладке при инициализации с недопустимой строкой.
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)}}
Вот расширение Swift, UIColorкоторое принимает шестнадцатеричную строку:
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}}
Использование:
//Hex to Color
let countPartColor =UIColor(hexString:"E43038")//Color to Hex
let colorHexString =UIColor(red:228, green:48, blue:56, alpha:1.0).toHexString()
Мне нравится ответ @ Luca, так как я думаю, что он самый элегантный.
Однако я не хочу, чтобы мои цвета указывались в ARGB . Я бы предпочел RGBA +, также мне нужно было взломать в случае работы со строками, которые указывают 1 символ для каждого из каналов " #FFFA ".
Эта версия также добавляет ошибку, выбрасывая + удаляет символ '#', если он включен в строку. Вот моя модифицированная форма для 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
на самом деле 3 цветовых компонента в шестнадцатеричном формате - красныйff
, зеленыйff
и синийff
. Вы можете написать шестнадцатеричное обозначение в Swift, используя0x
префикс, например0xFF
.Ответы:
#ffffff
на самом деле 3 цветовых компонента в шестнадцатеричном формате - красныйff
, зеленыйff
и синийff
. Вы можете написать шестнадцатеричное обозначение в Swift, используя0x
префикс, например0xFF
Чтобы упростить преобразование, давайте создадим инициализатор, который принимает целочисленные (0 - 255) значения:
Использование:
Как получить альфа?
В зависимости от вашего варианта использования вы можете просто использовать собственный
UIColor.withAlphaComponent
метод, напримерИли вы можете добавить дополнительный (необязательный) параметр к вышеуказанным методам:
(мы не можем назвать параметр
alpha
из-за конфликта имен с существующим инициализатором).Называется как:
Чтобы получить альфа как целое число 0-255, мы можем
Называется как
Или комбинация предыдущих методов. Нет абсолютно никакой необходимости использовать строки.
источник
alpha
Это функция, которая принимает шестнадцатеричную строку и возвращает UIColor.
(Вы можете ввести шестнадцатеричные строки в любом формате:
#ffffff
илиffffff
)Использование:
Свифт 5: (Свифт 4+)
Свифт 3:
Свифт 2:
Источник: аршад / суть: de147c42d7b3063ef7bc
Изменить: обновил код. Спасибо, Хлунг, Джейтрикс, Ахмад Ф, Кегам К и Адам Уэйт!
источник
countelements
сейчас простоcount
:)count
сейчас делать, а не представляютcountElements
, что они хотят, чтобы мы использовали?cString = cString.substringFromIndex(advance(cString.startIndex, 1))
чтобыcString = cString.substringFromIndex(cString.startIndex.advancedBy(1))
для Swift 2.2 Xcode 7.3UInt32
чтобыUInt64
scanHexInt32
. ИспользуйтеUInt64
иscanHexInt64
вместо.Swift 5 (Swift 4, Swift 3) UIColor расширение:
Использование :
Версия Swift 2.x :
источник
UIColor
:CGColor
:использование
источник
let foo: Int = 0x123ABC
- обратите внимание на '0x'Свифт 4 : Сочетание ответов Султана и Луки Тореллы:
Примеры использования:
источник
С Swift 2.0 и Xcode 7.0.1 вы можете создать эту функцию:
а затем использовать его таким образом:
Обновлено для Swift 4
источник
Swift 5.1: поддержка шестнадцатеричных и CSS имен цветов через UIColor
Гист код
Свифт Пакет
Пример строки:
Orange
,Lime
,Tomato
И т.д.Clear
,Transparent
,nil
, И пустой выход строки[UIColor clearColor]
abc
abc7
#abc7
00FFFF
#00FFFF
00FFFF77
Выход детской площадки:
источник
Самый простой способ добавить цвет программным способом - использовать ColorLiteral .
Просто добавьте свойство ColorLiteral, как показано в примере, Xcode предложит вам полный список цветов, которые вы можете выбрать. Преимущество этого состоит в уменьшении кода, добавлении значений HEX или RGB . Вы также получите недавно использованные цвета из раскадровки.
Пример: self.view.backgroundColor = ColorLiteral
источник
Предупреждение «scanHexInt32» устарела в iOS 13.0 »было исправлено.
Образец должен работать на Swift2.2 и выше (Swift2.x, Swift3.x, Swift4.x, Swift5.x):
Используйте их, как показано ниже:
источник
Этот ответ показывает, как это сделать в Obj-C. Мост должен использовать
источник
Я объединил несколько идей из этой ветки ответов и обновил их для iOS 13 и Swift 5 .
Затем вы можете использовать его так:
источник
Swift 5: Вы можете создавать цвета в XCode, как объяснено на следующих двух изображениях:
Вы должны назвать цвет, потому что вы ссылаетесь на цвет по имени. Как показано на рисунке 2:
источник
Другой метод
Swift 3.0
Написать расширение для UIColor
вы можете напрямую создать UIColor с помощью hex
источник
Последняя версия swift3
Используйте в своем классе или где-либо, когда вы конвертировали в hexcolor в uicolor, как, например, таким образом
источник
Вот что я использую. Работает с цветными строками из 6 и 8 символов, с символом # или без него. По умолчанию черный в выпуске и вылетает при отладке при инициализации с недопустимой строкой.
Использование:
источник
Вот расширение Swift,
UIColor
которое принимает шестнадцатеричную строку:источник
Как пользоваться
источник
Шестнадцатеричный с проверкой
подробности
Решение
использование
источник
NSPredicate
просто проверять регулярные выражения.string.range(of: pattern, options: .regularExpression)
тоже работаетВы можете использовать его в Swift 5
SWIFT 5
источник
Простое расширение цвета для Swift 5 / SwiftUI
Пример:
Код:
источник
Swift 2.0:
В viewDidLoad ()
источник
Swift 5
Вызов с использованием UIColor (hexString: "ваша шестнадцатеричная строка")
источник
Поддержка 7 типов цвета Hex
Существует 7 шестнадцатеричных цветовых форматов: "" # FF0000 "," 0xFF0000 "," FF0000 "," F00 "," red ", 0x00FF00, 16711935
ВНИМАНИЕ: Это не «решение с одним файлом», есть некоторые зависимости, но выследить их может быть быстрее, чем исследовать это с нуля.
https://github.com/eonist/swift-utils/blob/2882002682c4d2a3dc7cb3045c45f66ed59d566d/geom/color/NSColorParser.swift
Постоянная ссылка:
https://github.com/eonist/Element/wiki/Progress#supporting-7-hex-color-types
источник
Swift 2.0
Код ниже протестирован на xcode 7.2
источник
Swift 2.0:
Сделайте расширение UIColor.
Использование:
источник
Для быстрой 3
источник
Вы можете использовать это расширение на UIColor, которое преобразует вашу строку (шестнадцатеричный, RGBA) в UIColor и наоборот.
источник
Расширение UIColor, это очень поможет вам! (версия :Swift 4.0 )
источник
Версия RGBA Swift 3/4
Мне нравится ответ @ Luca, так как я думаю, что он самый элегантный.
Однако я не хочу, чтобы мои цвета указывались в ARGB . Я бы предпочел RGBA +, также мне нужно было взломать в случае работы со строками, которые указывают 1 символ для каждого из каналов " #FFFA ".
Эта версия также добавляет ошибку, выбрасывая + удаляет символ '#', если он включен в строку. Вот моя модифицированная форма для Swift.
источник
Использование:
источник