2011-09-17 2 views
0

NSGradientを使用していますが、色を追加/変更/削除する必要があります。 NSGradientは私が知る限り不変です。これを行う方法がわかっている唯一の方法は、新しいグラデーションを作成し、プロセス内の色とその位置を変更することです。色を追加したり、色の位置を変更したりするのに、色を削除するためのこの方法では何の問題もありませんでした。NSGradientで色を削除する問題 - Cocoa/Objective-C

がここに勾配「グラデーション」から色を削除機能だそのインデックス与えられている:

- (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 ----灰色----黒色| 2番目の色(gray、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 

なぜこれが起こりますか?それはまったく意味がありません! (まあ、考えてみると、解決策が見つかるまではほとんどバグはありませんが、まだ....)。ありがとう!

答えて

4

ライン

locations[i] = location; 

が正しくありません。ここでは、iは、新しい色配列へのインデックスではなく、元の勾配へのインデックスです。 locationsに割り当てるとき

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

をあるいは単にnewColorsアレイに追加するときにのみインクリメント新しいインデックスカウンタjを追加し、そのインデックスを使用します:

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

おかげで、他のソリューションの中で、あなたが使用することができますとても!チャームのように働いた! – Alex