删除颜色的NSGradient问题 - Cocoa / Objective-C

时间:2011-09-17 22:32:26

标签: objective-c cocoa nsgradient

我正在使用NSGradient进行某些操作,在某些时候我需要添加/更改/删除颜色。现在NSGradient是不可变的,据我所知,我知道如何做到这一点的唯一方法是创建一个新的渐变并在过程中更改颜色及其位置。我对这种添加颜色和改变颜色位置的方法没有任何问题,但是删除颜色会发生奇怪的事情。

这是从渐变'渐变'中删除颜色的函数:

- (void)_deleteColorAtIndex: (NSInteger)colorIndex
{
    if (!([self.gradient numberOfColorStops] > 2)) { return; }

    NSMutableArray* newColors = [NSMutableArray arrayWithCapacity: [self.gradient numberOfColorStops] - 1];
    CGFloat locations[[self.gradient numberOfColorStops] - 1];

    NSLog(@"Gradient before:");
    int i;
    for (i = 0; i < [self.gradient numberOfColorStops]; i++) {
        NSColor* color;
        CGFloat location;
        [self.gradient getColor: &color location: &location atIndex: i];
        NSLog(@" - Color: %@ / Location: %.2f", color, location);
    }

    //int i;
    NSLog(@"Adding this to new gradient:");

    // ----------------------------
    for (i = 0; i < [self.gradient numberOfColorStops]; i++) {
        NSColor* color;
        CGFloat location;
        [self.gradient getColor: &color location: &location atIndex: i];

        if (colorIndex != i) {
            [newColors addObject: color];
            locations[i] = location;
            NSLog(@" - Color: %@ / Location: %.2f", color, location);
        }
    }

    self.gradient = [[NSGradient alloc] initWithColors: newColors atLocations: locations colorSpace: [self.gradient colorSpace]];

    // ----------------------------        

    NSLog(@"Gradient after:");
    //int i;
    for (i = 0; i < [self.gradient numberOfColorStops]; i++) {
        NSColor* color;
        CGFloat location;
        [self.gradient getColor: &color location: &location atIndex: i];
        NSLog(@" - Color: %@ / Location: %.2f", color, location);
    }
}

重要的代码主要介于两个“// ----------------------------”之间。其余的只是为了调试目的。


问题

当我使用像| -white ---- gray ---- black- |这样的渐变运行此代码时并尝试删除第二种颜色(灰色,colorIndex = 1)我得到这个渐变:| -whiteblack --------- |。最后一种颜色跳到0.0位置。这是该代码的印刷文本:

Gradient before:
- Color: NSCustomColorSpace Generic RGB colorspace 1 1 1 1 / Location: 0.00
- Color: NSCustomColorSpace Generic RGB colorspace 0.5 0.5 0.5 1 / Location: 0.50
- Color: NSCustomColorSpace Generic RGB colorspace 0 0 0 1 / Location: 1.00
Adding this to new gradient:
- Color: NSCustomColorSpace Generic RGB colorspace 1 1 1 1 / Location: 0.00
- Color: NSCustomColorSpace Generic RGB colorspace 0 0 0 1 / Location: 1.00 <- cool here
Gradient after:
- Color: NSCustomColorSpace Generic RGB colorspace 1 1 1 1 / Location: 0.00
- Color: NSCustomColorSpace Generic RGB colorspace 0 0 0 1 / Location: 0.00 <- disaster here

为什么会这样?这根本没有意义!! (好吧,想想看,在你找到解决方案之前几乎没有bug,但仍然......)。谢谢!

1 个答案:

答案 0 :(得分:4)

该行

locations[i] = location;

不正确。这里,i是原始渐变的索引,而不是新颜色数组的索引。在其他解决方案中,您可以使用:

locations[[newColors count]-1] = location;

或者只添加一个新的索引计数器j,只有在添加到newColors数组时才会递增,并在分配给locations时使用该索引:

[newColors addObject:color];
locations[j++] = location;