Tengo una subclase de NSView que es parte de una .xib-archivo de una subclase de NSDocument, que se reaviva el comportamiento por defecto de NSDocumentController‘s openDocument: método. En esta subclase NSView me han implementado los métodos awakeFromNib, en la que la vista del NSWindow setAcceptsMouseMovedEvents:YES método es llamado, y acceptsFirstMouse:, que devuelve YES. Pero mi mouseMoved: implementación del método de mi subclases NSView no consigue llamado cuando muevo el ratón sobre él. ¿Cuál podría ser el problema?

Dependiendo de su caso, usted puede ser capaz de utilizar MouseDragged. Que funciona sin un NSTrackingArea, pero sólo se activa si el ratón hacia abajo.

OriginalEl autor Dominik Seibold | 2011-09-25

4 Comentarios

  1. 10

    No he utilizado mouseMoved: en un proyecto real (solo he jugado un poco). Como lo que yo puedo decir, mouseMoved: se llama sólo cuando su punto de vista es el de primera respuesta y, a continuación, no sólo mientras el ratón está encima de su punto de vista, pero siempre cuando se mueve el ratón. Usted puede ser mejor usar un NSTrackingArea. Compruebe la Cacao En La Gestión De Eventos Guía para obtener más información.

    Esto no responde a la pregunta, en realidad.
    Ver a continuación. Usted necesita un área de seguimiento instalado en el fin de comenzar a recibir estos eventos.

    OriginalEl autor Michael

  2. 21

    Asegúrese de solicitar el mouseMoved se envía el evento:

    NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect |  
                             NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);
    
    NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds]
                                                        options:options
                                                          owner:self
                                                       userInfo:nil];
    Una sola nota. No estoy seguro de que debe ser un int, pero en lugar de un NSInteger tipo o el typedef preferiblemente NSTrackingAreaOptions que es infinitamente más legible y garantizado para ser el tipo de derecho.
    esta es la respuesta correcta en realidad
    Esto es correcto, pero no da ninguna contexto donde este debe ser llamado. Consulte stackoverflow.com/a/41878227/5552584 para que la información.

    OriginalEl autor zeeple

  3. 8

    Como notado por los demás, un NSTrackingArea es una buena solución, y un lugar apropiado para instalar el área de seguimiento es NSView.updateTrackingAreas(). No es necesario para establecer el contenido de NSWindow del setAcceptsMouseMovedEvents de la propiedad.

    En Swift 3:

    class CustomView : NSView {
    
        var trackingArea : NSTrackingArea?
    
        override func updateTrackingAreas() {
            if trackingArea != nil {
                self.removeTrackingArea(trackingArea!)
            }
            let options : NSTrackingAreaOptions =
                [.mouseEnteredAndExited, .mouseMoved, .activeInKeyWindow]
            trackingArea = NSTrackingArea(rect: self.bounds, options: options,
                                          owner: self, userInfo: nil)
            self.addTrackingArea(trackingArea!)
        }
    
        override func mouseMoved(with event: NSEvent) {
            Swift.print("Mouse moved: \(event)")
        }
    }
    .mouseEnteredAndExited, .mouseMoved, .activeInKeyWindow => .mouseEnteredAndExited, .mouseMoved, .activeInKeyWindow

    OriginalEl autor jbouwman

  4. 1

    Sólo en caso de que nadie se ejecuta en esto. Me encontré con un problema en el que yo era crear subclases de una subclase, y estaba tratando de agregar un área de seguimiento a las dos clases (por dos razones diferentes).

    Si usted está haciendo algo como esto, usted necesita para asegurarse de que su mouseMoved:, etc de llamada en el super, o sólo uno de sus subclases recibirá el mensaje.

    - (void) mouseMoved: (NSEvent*) theEvent
    {
        //Call the super event
        [super mouseMoved: theEvent];
    }

    OriginalEl autor Kyle

Dejar respuesta

Please enter your comment!
Please enter your name here