为渐变位置创建CGFloat数组

时间:2013-10-26 05:29:05

标签: objective-c macos cocoa nsgradient

我正在尝试用字典数组(colorArray2)创建渐变颜色。这本词典包含5个键:r,g,b,a,p。 r,g,b,a是组件值(字符串),p是位置。我正在尝试使用 initWithColors:atLocations:colorSpace 创建渐变颜色。现在,我有以下内容。

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值的数组,包含渐变中每种颜色的位置。如何枚举创建浮点数组的任何内容?

感谢您的帮助。

更新

更具体地说,我如何使pArray得到像

这样的东西
double d[] = {0.1, 0.2, 0.3, 0.5, 1.0};

这样我就可以了

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

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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];

答案 2 :(得分: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];

答案 3 :(得分: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只会创建难以阅读并最终变得无法维护的意大利面条代码。