2011-09-17 4 views
0

일부 항목에는 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 

왜 이런 일이 발생합니까? 그것은 전혀 이해가 안됩니다! (글쎄, 생각 해보니, 해결책을 찾을 때까지 거의 버그가 없지만 여전히 ....). 감사!

답변

4

라인

locations[i] = location; 

이 올바르지 않습니다. 여기에서 i은 새 색상 배열에 대한 인덱스가 아니라 원래의 그래디언트에 대한 인덱스입니다. locations에 할당 할 때

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

또는 단지 newColors 배열에 추가 할 때 만 증가 새로운 인덱스 카운터 j를 추가하고 해당 인덱스를 사용합니다 :

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

덕분에 다른 솔루션 중, 당신은 사용할 수 있습니다 흠뻑! 매력처럼 일했습니다! – Alex