0

我正在使用 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

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

4

1 回答 1

4

线

locations[i] = location;

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

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

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

[newColors addObject:color];
locations[j++] = location;
于 2011-09-17T22:40:07.413 回答