2012-03-31 20 views
7

Chciałbym mieć podklasę NSSegmentedControl, gdzie różne segmenty są różne kolory. Próbowałem instacji NSSegmentedControl i dodając następujący kod:NSSegmentedControl Kolory

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

enter image description here

Wygląda blisko chyba że kolory 1. cała segmentacji kontrolować samego koloru czerwonego, w tym przypadku, i 2. Jest trochę koloru przelewa się na krawędziach.

Próbowałem też instacji NSSegmentedCell i dodając to:

- (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

Jest lepiej, że różne segmenty są wyświetlane niepowtarzalne kolory, jednak ja raczej nie uznają to dopuszczalne. Chcę, aby cały segment został wypełniony odpowiednim kolorem dla tego segmentu i byłoby miło, gdyby miał gradient i cieniowanie, jak na pierwszym zrzucie ekranu.

Proszę dać mi znać, jak mogę to osiągnąć.

Dzięki.

+0

jesteś szczęście, że obecna implementacja segmentowanego sterowania wykorzystuje przezroczystość w jego rysunku. Dzięki temu czerwone, które malujesz pod kontrolą, świecą. To może się zmienić przy każdej aktualizacji systemu Mac OS X. Aby to zrobić poprawnie, należy utworzyć własną podklasę NSView, która wykonuje cały rysunek w drawRect: zamiast próbować odcień istniejącego kontrolki. –

+0

Och, Jon, prawdopodobnie związany z tym, co mówisz, jest w rzeczywistości około pół tuzina różnych stylów. Zastanawiam się, jak mogą wpływać na to inne style. –

Odpowiedz

4

Należy określić stałą szerokość segmentów.

enter image description here

Wtedy twój kod będzie działał całkiem dobry (Zrzut ekranu z mojego projektu badawczego)

enter image description here

I nie zapomnij wyłączyć odcień

[self.segment.cell setControlTint:NSClearControlTint ];