2013-10-26 16 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值的數組。我如何枚舉任何創建一個浮點數組?

謝謝你的幫助。

更新

更具體地說,我怎麼做粒子陣列要達到這樣的

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

這個問題是關於創建一個浮點數組。 –

+0

CGFloat位置[3] = {0.0,0.5,1.0}; CGFloat只是float或double的typedef。你可以通過命令雙擊Xcode中的「CGFloat」來看到它自己,它會跳轉到定義了typedef的CGBase.h頭文件中。 –

+0

已經發布了兩種解決方案。你的論點在哪裏? –

0

要其他答案:沒有。就是不行。

實際答案: 所有的How do I make an array of CGFloats in objective c?

首先,這是Objective-C的,不是C.從技術上講,你可以使用malloc,但是這是一個真的很可怕的黑客。您應該轉換爲NSNumber,然後您可以填入NSArray。之後,您可以使用NSNumber的floatValue方法進行轉換。這種方式是正確的Objective-C。混合和匹配C和Obj-C只會創建難以閱讀並最終變得不可維護的意大利麪代碼。

+0

'[NSGradient initWithColors]'_requires_你傳遞一個C風格的數組。這是問題中的用例。 – peterflynn