首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除色Cocoa/Objective的NSGradient问题

删除色Cocoa/Objective的NSGradient问题
EN

Stack Overflow用户
提问于 2011-09-17 22:32:25
回答 1查看 298关注 0票数 0

我正在使用一个NSGradient来做一些事情,在某些时候我需要添加/更改/删除颜色。现在,据我所知,NSGradient是不可变的,所以我知道如何做到这一点的唯一方法是创建一个新的梯度,并在这个过程中改变颜色和它们的位置。我对这种添加颜色和改变颜色位置的方法没有问题,但是对于删除颜色,发生了一些奇怪的事情。

下面是从给定其索引的渐变“渐变”中删除颜色的函数:

代码语言:javascript
复制
- (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);
    }
}

重要的代码主要在两个"//“其余的只是为了调试目的。

问题

当我用渐变的方式运行这个代码时,比如白色的,灰色的,黑色的,然后尝试删除第二种颜色(灰色,colorIndex = 1),我得到了这个梯度:白--白-白色最后一种颜色跳转到0.0位置。下面是该代码的打印文本:

代码语言:javascript
复制
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会发生,但是……)。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-17 22:40:07

线

代码语言:javascript
复制
locations[i] = location;

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

代码语言:javascript
复制
locations[[newColors count]-1] = location;

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

代码语言:javascript
复制
[newColors addObject:color];
locations[j++] = location;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7458266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档