Я использую 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);
}
}
Важный код в основном находится между двумя "// ----------------------------" штуками,Остальное только для целей отладки.
Проблема
Когда я запускаю этот код с градиентом вроде | -белый ---- серый----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
Почему это происходит ???Это не имеет никакого смысла!(ну, если подумать, почти нет ошибок, пока вы не найдете решение, но все же ....).Спасибо!