2012-03-31 13 views
7

Me gustaría tener una subclase de NSSegmentedControl donde los distintos segmentos sean de diferentes colores. He intentado crear subclases NSSegmentedControl y añadiendo el siguiente código:NSSegmentedControl Colors

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

enter image description here

Eso parece estar cerca excepto que los colores 1. segmenta el conjunto de control del mismo color, rojo en este caso, y 2. no hay un poco de color sangra en los bordes.

También probé la subclasificación NSSegmentedCell y añadiendo esto:

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

Esto es mejor que en los diversos segmentos están mostrando colores únicos, sin embargo yo no consideraría esto aceptable. Quiero que se complete el segmento completo con el color apropiado para ese segmento y sería bueno si tuviera el degradado y el sombreado como en la primera captura de pantalla.

Háganme saber cómo puedo lograr esto.

Gracias.

+0

Eres Afligiendo que la implementación actual del control segmentado usa translucidez en su dibujo. Esto permite que el rojo que está pintando debajo del control brille. Eso podría cambiar con cualquier actualización de Mac OS X. Para hacer esto correctamente, debe crear su propia subclase NSView que haga todo el dibujo en drawRect: en lugar de intentar matizar el control existente. –

+0

Oh, Jon, posiblemente relacionado con lo que dices, en realidad hay alrededor de media docena de estilos diferentes. Me pregunto cómo los otros estilos también podrían afectar esto. –

Respuesta

4

Debe especificar el ancho fijo para los segmentos.

enter image description here

A continuación, el código funcionará bastante bien (captura de pantalla es de mi proyecto de prueba)

enter image description here

y no se olvide desactivar el tinte

[self.segment.cell setControlTint:NSClearControlTint ]; 
Cuestiones relacionadas