cocoa nsbutton nsbuttoncell

cocoa - Simple efecto mouseover en NSButton



nsbuttoncell (5)

Aquí es que he creado y trabajado para mí perfectamente ...

Paso 1: Crea el botón con área de seguimiento

NSButton *myButton = [[NSButton alloc] initWithFrame:NSMakeRect(100, 7, 100, 50)]; [myButton setTitle:@"sample"]; [self.window.contentView addSubview:myButton]; // Insert code here to initialize your application NSTrackingArea* trackingArea = [[NSTrackingArea alloc] initWithRect:[myButton bounds] options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways owner:self userInfo:nil]; [myButton addTrackingArea:trackingArea];

Paso: 2 Implementar los siguientes métodos.

- (void)mouseEntered:(NSEvent *)theEvent{ NSLog(@"entered"); [[myButton cell] setBackgroundColor:[NSColor blueColor]]; } - (void)mouseExited:(NSEvent *)theEvent{ [[myButton cell] setBackgroundColor:[NSColor redColor]]; NSLog(@"exited"); }

Estoy creando un NSButtonCell personalizado para un renderizado personalizado.

Ahora, quiero tener un aspecto diferente dependiendo de si el mouse está sobre el botón o no. ¿Cómo puedo obtener esta información?

Gracias y saludos,


Debe Subclase la clase NSButton (o incluso mejor la clase NSButtonCell). Como dijo Justin si pones los dos métodos.

- (void)mouseEntered:(NSEvent *)theEvent; - (void)mouseExited:(NSEvent *)theEvent;

Deben ser llamados cuando el mouse entra y sale del área. Es posible que también debas volver a crear el área de seguimiento, mira aquí:

- (void)updateTrackingAreas

Para el efecto de entrada y salida, jugué con el animador y el valor alfa, por ejemplo:

[self animator]setAlphaValue:0.5];


Para aquellos que prefieren crear subclases, también puede crear su propio NSButton y asignarle el NSTrackingArea .

Esta es una forma realmente simple y elegante de hacerlo, gracias a Joey Zhou : https://github.com/Swift-Kit/JZHoverNSButton

Está escrito en Swift 2, pero XCode lo traducirá automáticamente en Swift 3 - 4 sin ningún problema.

Espero que pueda ayudar a alguien


Un buen punto de partida, declarado en NSResponder:

- (void)mouseEntered:(NSEvent *)theEvent; - (void)mouseExited:(NSEvent *)theEvent;

específicamente, el contenedor de la celda del botón (no la celda en sí) es el NSResponder.


Swift 3:

Crea el botón con código o simplemente usa su @IBOutlet. A continuación, defina el área de seguimiento del botón para pasar el mouse (desplazar):

let area = NSTrackingArea.init(rect: yourButtonName.bounds, options: [.mouseEnteredAndExited, .activeAlways], owner: self, userInfo: nil) yourButtonName.addTrackingArea(area)

Luego anule mouseEntered y mouseExited, configure lo que quiera cambiar (color de botón, imagen de botón, texto de botón, ...) en estas funciones:

override func mouseEntered(with event: NSEvent) { print("Entered: /(event)") } override func mouseExited(with event: NSEvent) { print("Exited: /(event)") }

Si tiene varios botones (con área de seguimiento agregada para cada uno) y necesita identificar qué botón activó el evento mouseEntered, puede agregar información de información de usuario para este propósito, por lo que en lugar de:

userInfo: nil

Agregue el nombre de su botón personalizado en userInfo para cada botón, por ejemplo:

userInfo: ["btnName": "yourButtonName"]

Luego, puede escribir un caso de conmutador o instrucciones en su mouseEntered y mouseExited funciones como esta:

override func mouseEntered(with event: NSEvent) { // Identify which button triggered the mouseEntered event if let buttonName = event.trackingArea?.userInfo?.values.first as? String { switch (buttonName) { case "yourButtonName": //do whatever you want for this button.. case "anotherButtonName": //do whatever you want for this button.. default: print("The given button name: /"/(buttonName)/" is unknown!") } } }