2011-08-05 8 views
6

Quiero crear un conmutador personalizado para mi aplicación, en el cual proporciono tres imágenes para los posibles estados (encendido, apagado, mousedown). Toda la apariencia está contenida en las imágenes, por lo que no quiero que Cocoa resalte (oscurezca) el botón solo durante el mousedown.Personalizar un NSButtonCell con imágenes y resaltar

Por el momento, he creado una subclase NSButtonCell, he arrastrado un botón de bisel de NSButtonTypeMomentaryChange a mi vista y he configurado de forma personalizada el tipo de clase de celda de botón en mi subclase. La subclase simplemente implementa awakeFromNib para tratar de unos puso comportamiento deseado:

- (void)awakeFromNib 
{ 
    [self setShowsStateBy:NSContentsCellMask]; 
    [self setHighlightsBy:NSContentsCellMask]; 
} 

lo que pensé que (según la documentación) hará imposible la mousedown-oscurecimiento del botón. No es asi.

Esta es mi posición y ahora tengo dos preguntas:

  • ¿Cómo puedo configurar la clase de pila de botón para mostrar sólo mi imagen preparada en mousedown y no se oscurecen/dibujar los bordes alrededor de la tecla?
  • ¿Cuál sería la forma más limpia/más adecuada de implementar el otro comportamiento de un interruptor, es decir, mostrando la posición de apagado/encendido según el estado anterior y pudiendo comunicar su estado adecuadamente a otros objetos?

Respuesta

5

Establezca el tipo de su botón en Activado/Desactivado. Subclase su celda. Escribe estos dos métodos:

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView 
{ 
    if ([self state]) 
    { 
     [onStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 
    } 
    else 
    { 
     [offStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 
    } 
} 
- (void)highlight:(BOOL)flag withFrame:(NSRect)cellFrame inView:(NSView *)controlView 
{ 
    if (flag){ 
     [downStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 

    } 
} 
+0

Eso es todo, gracias. – mss

Cuestiones relacionadas