2009-11-17 2 views
14

Мне нужно преобразовать UIColor в NSString названия цвета.Как преобразовать значение UIColor в именованную строку цвета?

Я пробовал:

NSString *colorString = NSStringFromClass([[UIColor redColor] class]); 

Но colorString не дал @ "redColor".

+0

Какой формат вы хотите в результате NSString иметь? Что вы собираетесь делать с этой строкой? (Показать пользователю, сохранить в файл, ...) –

+1

hi, например ... whiteColor .. Я хочу преобразовать его в строку Тип данных ..... @ "whiteColor" ...? –

+0

Я хочу конвертировать в UTF8String ..? Любую помощь ..? –

ответ

10

Для чего вы хотите это сделать? Посмотрите на общий -desciption метод для начала

UIColor* someColor = ...//Initialize color 
NSString* colorString = [someColor description]; 
+0

Это решение отлично работает в отладчике XCode (с XCode 4.6.3). –

+1

Не работает, дает RGBa вместо «Цвет, который я собираюсь использовать, -> UIDeviceRGBColorSpace 1 0 0 1' –

+0

вы получаете строку отладки. а не строковое значение цвета –

4

Как об этом:

- (NSString *)stringForColor:(UIColor *)color { 
    CGColorRef c = color.CGColor; 
    const CGFloat *components = CGColorGetComponents(c); 
    size_t numberOfComponents = CGColorGetNumberOfComponents(c); 
    NSMutableString *s = [[[NSMutableString alloc] init] autorelease]; 
    [s appendString:@"{"]; 
    for (size_t i = 0; i < numberOfComponents; ++i) { 
     if (i > 0) { 
      [s appendString:@","]; 
     } 
     [s appendString:[NSString stringWithFormat:@"%f", components[i]]]; 
    } 
    [s appendString:@"}"]; 
    return s; 
} 

Например, stringForColor:[UIColor greenColor] имеет результат "{0.000000,1.000000,0.000000,1.000000}".

+0

Фактически, -значение возвращает то же самое + Цветовое пространство – Vladimir

+0

Да, но -description также включает имя класса, которое может быть или не быть желательным (спрашивающий не говорит, что он хочет, чтобы строка была выглядит как). –

17
UIColor *color = value; 
const CGFloat *components = CGColorGetComponents(color.CGColor); 
NSString *colorAsString = [NSString stringWithFormat:@"%f,%f,%f,%f", components[0], components[1], components[2], components[3]]; 

Выполнено.

Если вы хотите, чтобы преобразовать строку обратно в объект UIColor:

NSArray *components = [colorAsString componentsSeparatedByString:@","]; 
CGFloat r = [[components objectAtIndex:0] floatValue]; 
CGFloat g = [[components objectAtIndex:1] floatValue]; 
CGFloat b = [[components objectAtIndex:2] floatValue]; 
CGFloat a = [[components objectAtIndex:3] floatValue]; 
UIColor *color = [UIColor colorWithRed:r green:g blue:b alpha:a]; 

Вы хранения объекта UIColor в качестве атрибута в Core Data? Если да, то проверить мой ответ на этот вопрос: Core Data data model: attribute type for UIColor

+0

Любая информация о том, как преобразовать эту строку обратно в uicolor? :) –

+0

Привет, не работает с 'whiteColor'. – Maulik

32

Класса CIColor содержит значение цвета и цветовое пространство, для которых цветовых значения действительны.

https://developer.apple.com/documentation/coreimage/cicolor

// UIColor to NSString 
CGColorRef colorRef = [UIColor grayColor].CGColor; 
NSString *colorString = [CIColor colorWithCGColor:colorRef].stringRepresentation; 

// NSString to UIColor 
CIColor *coreColor = [CIColor colorWithString:@"0.5 0.5 0.5 1.0"]; 
UIColor *color = [UIColor colorWithCIColor:coreColor]; 

----------------- Предупреждение -----------

Если вы хотите поддерживать все устройства Упомянутый выше способ преобразования NSString в UIColor не будет работать на всех устройствах.


stringRepresentation

Возвращает отформатированную строку, которая определяет компоненты цвета.

Строковое представление всегда имеет четыре компонента: красный, зеленый, синий и альфа.

https://developer.apple.com/documentation/coreimage/cicolor/1437910-stringrepresentation


colorWithString:

Создает объект цвета, используя значения компонентов RGBA цвета, указанные в строке.

https://developer.apple.com/documentation/coreimage/cicolor/1438059-colorwithstring

+2

Не уверен, почему в этом ответе так много оборотов. Это неверно. 'stringRepresentation' возвращает форматированную строку с компонентами цвета, а не имя цвета, на которое указывает OP. – memmons

+0

Он привел два примера: 'colorString не дал @" redColor "и' например ... whiteColor'. – memmons

+1

Спасибо! Именно то, что я искал. – Shantanu

0

Вот что я использовал для преобразования из CGColor в NSString формате #RRGGBBAA:

// Return the parsed core graphics color as a "#RRGGBBAA" string value 

+ (NSString*) cgColorToString:(CGColorRef)cgColorRef 
{ 
    const CGFloat *components = CGColorGetComponents(cgColorRef); 
    int red = (int)(components[0] * 255); 
    int green = (int)(components[1] * 255); 
    int blue = (int)(components[2] * 255); 
    int alpha = (int)(components[3] * 255); 
    return [NSString stringWithFormat:@"#%0.2X%0.2X%0.2X%0.2X", red, green, blue, alpha]; 
} 
+2

будьте осторожны с этим, потому что предполагается, что цвет находится в цветовом пространстве RGB, что не обязательно так. Например, UIColor.Black.CGColor находится в сером цветовом пространстве и имеет только два компонента (интенсивность и альфа). –

0

Это самый короткий путь для преобразования UIColor в NSString:

- (NSString *)stringFromColor:(UIColor *)color 
{ 
    const size_t totalComponents = CGColorGetNumberOfComponents(color.CGColor); 
    const CGFloat * components = CGColorGetComponents(color.CGColor); 
    return [NSString stringWithFormat:@"#%02X%02X%02X", 
      (int)(255 * components[MIN(0,totalComponents-2)]), 
      (int)(255 * components[MIN(1,totalComponents-2)]), 
      (int)(255 * components[MIN(2,totalComponents-2)])]; 
} 
+0

Отсутствует запятая на второй линии. – Womble

+0

@Womble спасибо! – k06a

5

Попробуйте это. Лучшее решение для моей problem.Might помочь вам, ребята тоже ..

https://github.com/daniel-beard/DBColorNames

+3

Это невероятная находка, и если имя цвета - то, о чем просит ОП, возможно, это должен быть принятый ответ. –

+1

Это должен быть признанный ответ. Если вам нужно описание цвета, ориентированное на пользователя, это путь. –

+0

Это было наиболее полезным решением. –

Смежные вопросы