일부 항목에는 NSGradient를 사용하고 있으며 어떤 시점에서는 색상을 추가/변경/삭제해야합니다. 이제 NSGradient는 내가 아는 한 변경할 수 없으므로이 작업을 수행하는 방법을 알고있는 유일한 방법은 새로운 그래디언트를 만들고 프로세스의 색상과 위치를 변경하는 것입니다. 색상을 추가하고 색상의 위치를 변경하는 데는이 방법을 사용하는 데 아무런 문제가 없지만 색상을 삭제하면 이상한 일이 발생합니다.NSGradient에서 색을 지우는 문제 - 코코아/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);
}
}
중요한 코드는 주로 두 개의 사이를 "// ---------- ------------------ "물건. 나머지는 디버깅 목적으로 만 사용됩니다.
문제
내가 좋아하는 그라데이션이 코드를 실행 | - 화이트 ---- 회색 ---- 블랙 | 두 번째 색상 (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