NSGradient проблема с удалением цвета - Какао / Objective-C - PullRequest
0 голосов
/ 18 сентября 2011

Я использую 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

Почему это происходит ???Это не имеет никакого смысла!(ну, если подумать, почти нет ошибок, пока вы не найдете решение, но все же ....).Спасибо!

1 Ответ

4 голосов
/ 18 сентября 2011

Неверная строка

locations[i] = location;

.Здесь i - это индекс в исходном градиенте, а не индекс в новом цветовом массиве.Среди других решений вы можете использовать:

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

или просто добавить новый счетчик индекса j, который вы увеличиваете только при добавлении в массив newColors, и использовать этот индекс при присваивании locations:

[newColors addObject:color];
locations[j++] = location;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...