Как конвертировать UIColor в HEX и отображать в NSLog
Я проверил несколько ссылок о том, как конвертировать коды UIColor в HEX, однако я не уверен, как вызвать метод для их отображения в NSLog. У меня нет репутации, чтобы прокомментировать эту публикацию, поскольку вопрос - последнее мое решение. Я хочу, чтобы он отображался при запуске моего приложения в журнале.
Во-вторых, где ввести номер цвета RGB (R = 30, G = 171, B = 13)? Я вижу, что все примеры используют Array [0], [1], [2], который обычно относится к позиции индекса, поэтому, где я могу добавить значения цвета?
У меня есть этот код:
- (NSString *) hexFromUIColor:(UIColor *)color {
if (CGColorGetNumberOfComponents(color.CGColor) < 4) {
const CGFloat *components = CGColorGetComponents(color.CGColor);
color = [UIColor colorWithRed:components[30] green:components[141] blue:components[13] alpha:components[1]];
}
if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) != kCGColorSpaceModelRGB) {
return [NSString stringWithFormat:@"#FFFFFF"];
}
return [NSString stringWithFormat:@"#%02X%02X%02X", (int)((CGColorGetComponents(color.CGColor))[0]*255.0), (int)((CGColorGetComponents(color.CGColor))[1]*255.0), (int)((CGColorGetComponents(color.CGColor))[2]*255.0)];
}
Ссылки, которые я проверил:
hex-цвет от uicolor
Как конвертировать цветовые коды HEX RGB в UIColor?
Я попытался вызвать метод в viewDidLoad, но он не будет работать без UIColor. Я уверен, что это что-то простое.
Спасибо всем, кто отвечает.
Что такое код, который я использую в моем viewDidLoad, чтобы вызвать этот метод для отображения в NSLog?
Ответы
Ответ 1
Используйте код ниже:
- (NSString *)hexStringFromColor:(UIColor *)color {
const CGFloat *components = CGColorGetComponents(color.CGColor);
CGFloat r = components[0];
CGFloat g = components[1];
CGFloat b = components[2];
return [NSString stringWithFormat:@"#%02lX%02lX%02lX",
lroundf(r * 255),
lroundf(g * 255),
lroundf(b * 255)];
}
После получения шестнадцатеричной строки кода вызовите метод ниже, чтобы получить UIColor
- (UIColor *) colorWithHexString: (NSString *) hexString
{
NSString *colorString = [[hexString stringByReplacingOccurrencesOfString: @"#" withString: @""] uppercaseString];
NSLog(@"colorString :%@",colorString);
CGFloat alpha, red, blue, green;
// #RGB
alpha = 1.0f;
red = [self colorComponentFrom: colorString start: 0 length: 2];
green = [self colorComponentFrom: colorString start: 2 length: 2];
blue = [self colorComponentFrom: colorString start: 4 length: 2];
return [UIColor colorWithRed: red green: green blue: blue alpha: alpha];
}
`
- (CGFloat) colorComponentFrom: (NSString *) string start: (NSUInteger) start length: (NSUInteger) length {
NSString *substring = [string substringWithRange: NSMakeRange(start, length)];
NSString *fullHex = length == 2 ? substring : [NSString stringWithFormat: @"%@%@", substring, substring];
unsigned hexComponent;
[[NSScanner scannerWithString: fullHex] scanHexInt: &hexComponent];
return hexComponent / 255.0;
}
ИСПОЛЬЗОВАНИЕ
// ( R = 30, G = 171, B = 13)?
CGFloat red = 30.0;
CGFloat green = 171.0;
CGFloat blue = 13.0;
CGFloat alpha = 255.0
UIColor *color = [UIColor colorWithRed:(red/255.0) green:(green/255.0) blue:(blue/255.0) alpha:(alpha/255.0)];
NSString *colorCode = [self hexStringFromColor:color];
NSLog(@"Color Code: %@", colorCode);
UIColor *resultColor = [self colorWithHexString:colorCode];
Ответ 2
Ответ на Kampai работает для цветов RGB, но не для монохромного (UIColor colorWithWhite: alpha:). Он также не обрабатывает альфа, поддерживаемый HEX. Здесь немного измененная версия hexStringFromColor:
+ (NSString *)hexStringFromColor:(UIColor *)color
{
CGColorSpaceModel colorSpace = CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor));
const CGFloat *components = CGColorGetComponents(color.CGColor);
CGFloat r, g, b, a;
if (colorSpace == kCGColorSpaceModelMonochrome) {
r = components[0];
g = components[0];
b = components[0];
a = components[1];
}
else if (colorSpace == kCGColorSpaceModelRGB) {
r = components[0];
g = components[1];
b = components[2];
a = components[3];
}
return [NSString stringWithFormat:@"#%02lX%02lX%02lX%02lX",
lroundf(r * 255),
lroundf(g * 255),
lroundf(b * 255),
lroundf(a * 255)];
}
Ответ 3
И, наконец, версия, которая работает с alpha -компонент и использует правый множитель
extension UIColor {
var hexString: String? {
var red: CGFloat = 0
var green: CGFloat = 0
var blue: CGFloat = 0
var alpha: CGFloat = 0
let multiplier = CGFloat(255.999999)
guard self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) else {
return nil
}
if alpha == 1.0 {
return String(
format: "#%02lX%02lX%02lX",
Int(red * multiplier),
Int(green * multiplier),
Int(blue * multiplier)
)
}
else {
return String(
format: "#%02lX%02lX%02lX%02lX",
Int(red * multiplier),
Int(green * multiplier),
Int(blue * multiplier),
Int(alpha * multiplier)
)
}
}
}
Ответ 4
Другие сообщения об ошибках Swift для UIColors, таких как белый, где есть только 2 компонента, возвращаемых CGColor.
Здесь версия Swift 4, которая не имеет этой проблемы, а также возвращает информацию о прозрачности в конце строки, если это необходимо (веб-формат).
Например:
Белый вернет #FFFFFF
Белый с непрозрачностью 50% вернет # FFFFFF7F
extension UIColor {
var hexString: String {
let colorRef = cgColor.components
let r = colorRef?[0] ?? 0
let g = colorRef?[1] ?? 0
let b = ((colorRef?.count ?? 0) > 2 ? colorRef?[2] : g) ?? 0
let a = cgColor.alpha
var color = String(
format: "#%02lX%02lX%02lX",
lroundf(Float(r * 255)),
lroundf(Float(g * 255)),
lroundf(Float(b * 255))
)
if a < 1 {
color += String(format: "%02lX", lroundf(Float(a)))
}
return color
}
}
Ответ 5
В Swift я просто создал расширение для UIColor...
extension UIColor
{
var hexString:NSString {
let colorRef = CGColorGetComponents(self.CGColor)
let r:CGFloat = colorRef[0]
let g:CGFloat = colorRef[1]
let b:CGFloat = colorRef[2]
return NSString(format: "#%02lX%02lX%02lX", lroundf(Float(r * 255)), lroundf(Float(g * 255)), lroundf(Float(b * 255)))
}
}
Ответ 6
Свифт 2 версии принятого ответа. Я преобразовал в расширение UIColor
.
extension UIColor {
var hexString: String {
let components = CGColorGetComponents(self.CGColor)
let red = Float(components[0])
let green = Float(components[1])
let blue = Float(components[2])
return String(format: "#%02lX%02lX%02lX", lroundf(red * 255), lroundf(green * 255), lroundf(blue * 255))
}
}
Ответ 7
Быстрый ответ 2, преобразованный в быстрый 3
var hexString: String {
let components = self.cgColor.components
let red = Float((components?[0])!)
let green = Float((components?[1])!)
let blue = Float((components?[2])!)
return String(format: "#%02lX%02lX%02lX", lroundf(red * 255), lroundf(green * 255), lroundf(blue * 255))
}
Ответ 8
Потенциальная ловушка при работе с альфой: строки HEX бывают разных форматов, некоторые имеют свою альфу в начале шестнадцатеричной строки, а в других форматах - в конце. В зависимости от вашего фона у вас может быть другое представление о том, как форматируется шестнадцатеричная строка. Для разработчиков Android он, скорее всего, будет с альфой в начале, для веб-разработчиков он, скорее всего, будет в конце строки. ТАК ВСЕГДА СОСТОЯНИЕ ФОРМАТА ХЕСТСКОЙ СТРОКИ, чтобы избежать путаницы. Андроидные шестнадцатеричные строки должны иметь альфа в начале. Итак, это ловушка, с которой люди могут попасть, когда дело доходит до шестнадцатеричных строк (я сделал), и поэтому важно сказать, каков ожидаемый формат. Поэтому, если вы разрабатываете приложение для iOS и Android, что для этой ловушки.
Ссылки:
https://en.wikipedia.org/wiki/RGBA_color_space, чтобы узнать, почему строка HEX может быть отформатирована по-разному, в некоторых случаях с альфой в начале. Android https://developer.android.com/reference/android/graphics/Color.html и https://gist.github.com/lopspower/03fb1cc0ac9f32ef38f4
ОБРАТИТЕ ВНИМАНИЕ ДЛЯ #AARRGGBB Формат шестнадцатеричной строки
Используйте следующий код, чтобы Alpha находилась в начале строки.
(Примечание: если возвращается color == null
черный).
+(NSString*)hexStringFromColor:(UIColor *)color
{
CGFloat r = 0, g = 0, b = 0, a = 1;
if (color) {
[color getRed:&r green:&g blue:&b alpha:&a];
}
return [NSString stringWithFormat:@"#%02lX%02lX%02lX%02lX",
lroundf(a * 255.0),
lroundf(r * 255.0),
lroundf(g * 255.0),
lroundf(b * 255.0)
];
}
Ответ 9
Это правильный порядок, если вам нужны цвета для Android. альфа идет первым:
extension UIColor {
var hexString: String? {
var red: CGFloat = 0
var green: CGFloat = 0
var blue: CGFloat = 0
var alpha: CGFloat = 0
let multiplier = CGFloat(255.999999)
guard self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) else {
return nil
}
if alpha == 1.0 {
return String(
format: "#%02lX%02lX%02lX",
Int(red * multiplier),
Int(green * multiplier),
Int(blue * multiplier)
)
}
else {
return String(
format: "#%02lX%02lX%02lX%02lX",
Int(alpha * multiplier),
Int(red * multiplier),
Int(green * multiplier),
Int(blue * multiplier)
)
}
}
}
Тогда позвоните как:
debugPrint("testColor > ", self.testColor().hexString!)
Ответ 10
Быстрый путь:
extension UIColor {
var hexString: String {
return cgColor.components![0..<3]
.map { String(format: "%02lX", Int($0 * 255)) }
.reduce("#", +)
}
}
Если вам нужен гекс с альфа-каналом, просто удалите [0..<3]
из кода.