2013-10-26 4 views
1

Я пытаюсь создать цвет градиента из массива словаря (colorArray2). Этот словарь содержит 5 ключей: r, g, b, a, p. r, g, b, a - значения компонентов (строки), p - местоположение. Я пытаюсь создать цвет градиента с initWithColors: atLocations: colorSpace. На данный момент у меня есть следующее.Создание массива CGFloat для градиентных локаций

NSGradient *aGradient; 
NSColorSpace *space = [NSColorSpace genericRGBColorSpace]; 
NSMutableArray *cArray = [[NSMutableArray alloc] initWithObjects:nil]; // storing colors 
NSMutableArray *pArray = [[NSMutableArray alloc] initWithObjects:nil]; // storing locations 
for (NSInteger i2 = 0; i2 < colorArray2.count; i2++) { 
    NSString *r = [[colorArray2 objectAtIndex:i2] objectForKey:key2a]; 
    NSString *g = [[colorArray2 objectAtIndex:i2] objectForKey:key2b]; 
    NSString *b = [[colorArray2 objectAtIndex:i2] objectForKey:key2c]; 
    NSString *a = [[colorArray2 objectAtIndex:i2] objectForKey:key2d]; 
    NSString *p = [[colorArray2 objectAtIndex:i2] objectForKey:key2e]; 
    NSColor *color = [NSColor colorWithSRGBRed:[r integerValue]/255.0f green:[g integerValue]/255.0f blue:[b integerValue]/255.0f alpha:[a integerValue]/100.0f]; 
    [cArray addObject:color]; 
    [pArray addObject:[NSNumber numberWithDouble:[p doubleValue]]]; 
} 

У меня есть массив (cArray), содержащий цвета. Я не знаю, как создать массив местоположений. Согласно документации, местоположения представляют собой массив значений CGFloat, содержащих местоположение для каждого цвета в градиенте. Как я могу перечислять все, что нужно для создания массива с плавающей точкой?

Благодарим за помощь.

Update

Более конкретно, как сделать PArray, чтобы получить что-то вроде

double d[] = {0.1, 0.2, 0.3, 0.5, 1.0}; 

, так что я могу иметь

aGradient = [[NSGradient alloc] initWithColors:cArray atLocations:d colorSpace:space]; 

ответ

0

NSGradient's documentation состояния, locations параметр должен быть в тип const CGFloat*, поэтому вы не можете использовать NSArray*. Должно работать следующее:

// Allocate a C-array with the same length of colorArray2 
CGFloat* pArray = (CGFloat*)malloc(colorArray2.count * sizeof(CGFloat)); 

for (NSInteger i2 = 0; i2 < colorArray2.count; i2++) { 
    // Extract location 
    NSString* p = [[colorArray2 objectAtIndex:i2] objectForKey:key2e]; 
    pArray[i2] = [p doubleValue]; 
} 

// Do whaterver with pArray 

... 

// Remember to free it 

free(pArray); 
+0

Умм ... Да. Я думаю, что это то, что у меня есть. Я отвечу на ваш вопрос. Спасибо. –

0

У меня есть.

NSInteger count,index; 
double *dArray; 

count = pArray.count; 
dArray = (double *) malloc(sizeof(double) * count); 
for (index = 0; index < count; index++) { 
    dArray[index] = [[pArray objectAtIndex:index] floatValue]; 
} 

aGradient = [[NSGradient alloc] initWithColors:cArray atLocations:dArray colorSpace:space]; 
0

Вы можете использовать:

NSArray *colors = @[[NSColor colorWithWhite:.3 alpha:1.0], 
        [NSColor colorWithWhite:.6 alpha:1.0], 
        [NSColor colorWithWhite:.3 alpha:1.0]]; 
CGFloat locations[3] = {0.0, 0.5, 1.0}; 
NSGradient *gradient = [[NSGradient alloc] initWithColors:colors atLocations:locations colorSpace:[NSColorSpace genericRGBColorSpace]]; 
[gradient drawInRect:CGRectMake(100.0, 7.0, 10.0, 18.0) angle:-90]; 
+0

Этот вопрос касается создания массива float. –

+0

Местоположение CGFloat [3] = {0,0, 0,5, 1,0}; CGFloat - это просто typedef для float или double. Вы можете сами убедиться в Command-двойном щелчке по «CGFloat» в Xcode - он перейдет к заголовку CGBase.h, где определен typedef. –

+0

Два решения уже отправлены. Куда вы идете с вашим аргументом? –

0

к другим ответам: нет. Просто нет.

Фактический ответ: How do I make an array of CGFloats in objective c?

Прежде всего, это Objective-C, а не C. Технически вы можете использовать таНос, но это действительно ужасный хак. Вы должны преобразовать в NSNumber, а затем вы можете заполнить NSArray. После этого вы можете конвертировать обратно с использованием метода NSNumber floatValue. Этот путь является правильным Objective-C. Смешивание и сопоставление C и Obj-C создает код спагетти, который трудно читать и в конечном итоге становится недоступным.

+0

'[NSGradient initWithColors]' _requires_ вам передать массив C-style. Это вопрос использования в вопросе. – peterflynn