【问题标题】:Creating An Array of CGFloat for Gradient Locations为梯度位置创建一个 CGFloat 数组
【发布时间】:2013-10-26 05:29:04
【问题描述】:

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

【问题讨论】:

    标签: objective-c macos cocoa nsgradient


    【解决方案1】:

    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);
    

    【讨论】:

    • 嗯...是的。我想这也是我所拥有的。我会把你的标记为答案。谢谢。
    【解决方案2】:

    我明白了。

    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];
    

    【讨论】:

      【解决方案3】:

      你可以使用:

      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];
      

      【讨论】:

      • 这个问题是关于创建一个浮点数组的。
      • CGFloat 位置[3] = {0.0, 0.5, 1.0}; CGFloat 只是 float 或 double 的 typedef。您可以通过 Command-双击 Xcode 中的“CGFloat”来亲自查看——它会跳转到定义 typedef 的 CGBase.h 标头。
      • 已经发布了两个解决方案。你的论点要去哪里?
      【解决方案4】:

      对于其他答案:没有。只是没有。

      实际答案: How do I make an array of CGFloats in objective c?

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

      【讨论】:

      • [NSGradient initWithColors] 要求你传递一个 C 风格的数组。这就是问题中的用例。
      猜你喜欢
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多