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
なぜこれが起こりますか?それはまったく意味がありません! (まあ、考えてみると、解決策が見つかるまではほとんどバグはありませんが、まだ....)。ありがとう!
おかげで、他のソリューションの中で、あなたが使用することができますとても!チャームのように働いた! – Alex