2012-03-31 15 views
7

Ich hätte gerne eine Unterklasse von NSSegmentedControl, wo die verschiedenen Segmente verschiedene Farben haben. Ich habe Subklassen NSSegmentedControl versucht, und das Hinzufügen von dem folgenden Code:NSSegmentedControl Farben

- (void)drawRect:(NSRect)dirtyRect 
{ 
    NSColor *color = [NSColor redColor]; 
    [color setFill]; 
    NSRectFill(dirtyRect); 
    [super drawRect:dirtyRect]; 
} 

enter image description here

Der Ausnahme, dass 1. es Farben in der Nähe sieht die ganze Kontrolle die gleiche Farbe, rot in diesem Fall segmentierte, und 2. es gibt ein wenig Farbe blutet an den Rändern.

Ich versuchte auch Subklassen NSSegmentedCell und das Hinzufügen dieser:

- (void)drawSegment:(NSInteger)segment inFrame:(NSRect)frame withView:(NSView *)controlView 
{ 
    NSColor *color; 
    switch (segment) { 
     case 0: 
      color = [NSColor redColor]; 
      break; 
     case 1: 
      color = [NSColor blueColor]; 
      break; 
     case 2: 
      color = [NSColor greenColor]; 
      break; 
     case 3: 
      color = [NSColor orangeColor]; 
      break; 
     default: 
      break; 
    } 
    [color setFill]; 
    NSRectFill(frame); 
    [super drawSegment:segment inFrame:frame withView:controlView]; 
} 

enter image description here

Das ist besser, dass die verschiedenen Segmente einzigartige Farben angezeigt wird, aber ich würde kaum diese für akzeptabel halten. Ich möchte, dass das gesamte Segment mit der entsprechenden Farbe für dieses Segment ausgefüllt wird, und es wäre schön, wenn es den Gradient und die Schattierung wie im ersten Screenshot hätte.

Bitte lassen Sie mich wissen, wie ich das erreichen kann.

Danke.

+0

Sie sind zu deaktivieren glücklicherweise, dass die aktuelle Implementierung der segmentierten Kontrolle Transluzenz in ihrer Zeichnung verwendet. Dadurch kann das Rot, das Sie unter dem Steuerelement malen, durchscheinen. Das könnte sich mit jedem Update auf Mac OS X ändern. Um dies richtig zu machen, sollten Sie Ihre eigene NSView-Unterklasse erstellen, die die gesamte Zeichnung in drawRect ausführt: anstatt zu versuchen, das vorhandene Steuerelement einzufärben. –

+0

Oh, Jon, möglicherweise verwandt mit dem, was du sagst, es gibt ungefähr ein halbes Dutzend verschiedener Stile. Ich frage mich, wie die anderen Stile dies auch beeinflussen könnten. –

Antwort

4

Sie müssen eine feste Breite für Segmente angeben.

enter image description here

Dann wird Ihr Code funktioniert ziemlich gut (Screenshot ist von meinem Testprojekt)

enter image description here

Und vergessen Sie nicht Tönung

[self.segment.cell setControlTint:NSClearControlTint ];