我正在使用一个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);
}
}重要的代码主要在两个"//“其余的只是为了调试目的。
问题
当我用渐变的方式运行这个代码时,比如白色的,灰色的,黑色的,然后尝试删除第二种颜色(灰色,colorIndex = 1),我得到了这个梯度:白--白-白色最后一种颜色跳转到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会发生,但是……)。谢谢!
发布于 2011-09-17 22:40:07
线
locations[i] = location;是不正确的。在这里,i是对原始梯度的索引,而不是对新颜色数组的索引。在其他解决方案中,您可以使用:
locations[[newColors count]-1] = location;或者仅仅添加一个新的索引计数器j,仅在添加到newColors数组时才会增加,并在分配给locations时使用该索引。
[newColors addObject:color];
locations[j++] = location;https://stackoverflow.com/questions/7458266
复制相似问题