1

我正在尝试从字典数组(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

4 回答 4

0

NSGradient 的文档指出locations参数应该是 type 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);
于 2013-10-26T06:31:51.943 回答
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];
于 2013-10-26T06:32:31.897 回答
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];
于 2014-01-19T11:40:05.260 回答
0

对于其他答案:没有。就是不行。

实际答案: 如何在目标 c 中制作一组 CGFloats?

首先,这是 Objective-C,而不是 C。从技术上讲,您可以使用 malloc,但这是一个非常糟糕的 hack。您应该转换为NSNumber,然后您可以填充NSArray. 之后,您可以使用 NSNumber 的floatValue方法转换回来。这种方式是正确的Objective-C。混合和匹配 C 和 Obj-C 只会创建难以阅读并最终变得无法维护的意大利面条式代码。

于 2014-11-20T22:58:09.403 回答