簡體   English   中英

NSGradient問題,刪除顏色-Cocoa / Objective-C

[英]NSGradient problem with deleting color - Cocoa/Objective-C

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

為什么會這樣??? 這根本沒有意義!! (好吧,想起來,在找到解決方案之前幾乎沒有錯誤,但是....)。 謝謝!

locations[i] = location;

是不正確的。 在這里, i是原始漸變的索引,而不是新顏色數組的索引。 在其他解決方案中,您可以使用:

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

或僅添加一個新的索引計數器j ,僅在添加到newColors數組時才遞增,並在分配給locations時使用該索引:

[newColors addObject:color];
locations[j++] = location;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM