2014-01-06 4 views
0

У меня есть UIColor, созданный [UIColor colorWithPatternImage:...];, и я хочу сохранить его в NSArray.Магазин UIColor в массиве

У меня есть проблема, однако, поскольку у меня есть следующий код для нормальных цветов

NSString *NSStringFromUIColor(UIColor *color) { 
    //Creates a string with RGB values of the color 
    const CGFloat *components = CGColorGetComponents(color.CGColor); 
    return [NSString stringWithFormat:@"[%f, %f, %f, %f]", 
      components[0], 
      components[1], 
      components[2], 
      components[3]]; 
} 

Но выше аварий с моим нестандартным patternColorFromImage. Итак, еще раз, как сохранить этот цвет в NSArray и т. Д.?

Благодаря

ответ

4

NSArray работает с объектами Objective-C, которым «(float)» слепок я вижу там определенно нет.

Чтобы быть более конкретным, «float», «int», «char» являются C data types, CGFloat представляет собой структуру данных, Core Graphics (а также не объективный объект С).

Если вы хотите сохранить цвета в массиве, они должны быть истинными "UIColor" Объекты Objective-C.

Если вы хотите сохранить CGFloats в NSArray, you can do the answer in this related question.

0

Если вы хотите сохранить параметризованные цвета в массиве, оберните значения в NSNumbers (хотя UIColor кажется лучшей альтернативой). Другими словами, либо

CGFloat red = 0.5; 
NSArray *colorParams = @[ [NSNumber numberWithFloat:red], // etc 

или, лучше:

NSArray *color = [UIColor colorWithRed:red // etc 

Любой из этих объектов могут быть помещены в другой массив:

NSArray *myArrayOfColors = @[ colorParams, color, // but watch out, we have two distinct 
// representations of colors in this array 
0

Вы не можете хранить типы C в NSArray. Вы можете сделать это:

[NSArray arrayWithObjects: [NSNumber numberWithDouble: components[0]], [NSNumber numberWithDouble: components[1]], nil]; 

Если на самом деле есть только два компонента. Вот более общий вариант:

CGColorRef cgColor = [myColor CGColor]; 
NSUInteger numComponents = CGColorGetNumberOfComponents(cgColor); 
CGFloat const *components = CGColorGetComponents(cgColor); 
NSNumber *componentObjects[numComponents]; 
for (NSUInteger i = 0; i < numComponents; i++) 
    componentObjects[i] = [NSNumber numberWithDouble: components[i]]; 
NSArray *colorArray = [NSArray arrayWithObjects: componentObjects count: numComponents]; 
-1

В выражении [UIColor redColor], очевидно, чтобы увидеть, что redColor является selector. Кроме того, мы можем преобразовать селекторы NSString с и наоборот с:

NSString colorSel = NSStringFromSelector(@selector(redColor)); 
SEL redSel = NSSelectorFromString(colorSel"); 

Я на ПК окна прямо сейчас, так не могу сказать наверняка, должен ли он быть заключен в @selector() или нет. Но вы можете попробовать их обоих, чтобы посмотреть, какой из них правильный.

Один вы получите селектор из строки, вы можете установить цвет с:

if ([UIColor respondsToSelector:redSel]) 
    yourElement.backgroundColor = [UIColor performSelector:redSel]; 

Это простой пример с основными UIColor с. Вы можете использовать макросы UIColorFromRGB, или CGColor s тоже.

Как только вы получите NSString с вашим цветом, вы можете легко сохранить их в массиве.

0
NSString* NSStringFromColor(UIColor* color) { 
    CGFloat r, g, b, a; 
    [color getRed:&r green:&g blue:&b alpha:&a]; 
    return [NSString stringWithFormat:@"[%f, %f, %f, %f"], r, g, b, a]; 
} 
Смежные вопросы