我正在尝试从字典数组(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];
NSGradient 的文档指出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);
您可以使用:
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];
对于其他答案:不。只是没有。
实际答案:如何在目标 c 中制作 CGFloat 数组?
首先,这是Objective-C,而不是C.从技术上讲,你可以使用malloc,但这是一个非常可怕的黑客。您应该转换为NSNumber
,然后您可以填充NSArray
。之后,您可以使用NSNumber的floatValue
方法转换回来。这种方式是适当的Objective-C。混合和匹配 C 和 Obj-C 只会创建难以阅读并最终变得无法维护的意大利面条代码。
我明白了。
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];