2012-03-31 3 views
7

Я хотел бы иметь подкласс NSSegmentedControl, где различные сегменты имеют разные цвета. Я попытался подклассов NSSegmentedControl и добавить следующий код:Цвета NSSegmentedControl

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

enter image description here

Это выглядит близко, за исключением того, что 1. окрашивает весь сегментированных контролировать тот же цвет, красный в этом случае, и 2. Есть немного красящего цвета по краям.

Я также попытался подклассов NSSegmentedCell и добавив следующее:

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

Это лучше в том, что различные сегменты отображения уникальных цветов, но я бы вряд ли считать это приемлемым. Я хочу, чтобы весь сегмент был заполнен соответствующим цветом для этого сегмента, и было бы неплохо, если бы у него был градиент и затенение, как на первом снимке экрана.

Пожалуйста, дайте мне знать, как я могу это достичь.

Спасибо.

+0

Ты что в текущей реализации сегментированного управления используется прозрачность в его чертеже. Это позволяет красному, что вы рисуете под контролем, чтобы сиять. Это может измениться при любом обновлении до Mac OS X. Чтобы сделать это правильно, вы должны сделать свой собственный подкласс NSView, который выполняет весь чертеж в drawRect: вместо того, чтобы подкрашивать существующий элемент управления. –

+0

О, Джон, возможно, связанный с тем, что вы говорите, на самом деле около полудюжины разных стилей. Интересно, как другие стили могут также повлиять на это. –

ответ

4

Необходимо указать фиксированную ширину для сегментов.

enter image description here

Тогда ваш код будет работать довольно хорошо (Скриншот из моего тестового проекта)

enter image description here

И не забудьте отключить Tint

[self.segment.cell setControlTint:NSClearControlTint ]; 
Смежные вопросы