MouseMoved не вызывается - PullRequest
       24

MouseMoved не вызывается

14 голосов
/ 25 сентября 2011

У меня есть подкласс NSView, который является частью .xib-файла для подкласса NSDocument, который оживает при использовании по умолчанию метода NSDocumentController openDocument:. В этом подклассе NSView я реализовал методы awakeFromNib, в которых вызывается метод NSWindow setAcceptsMouseMovedEvents:YES представления, и acceptsFirstMouse:, который возвращает YES. Но моя реализация метода mouseMoved: моего подкласса NSView не вызывается, когда я наводю на него мышь. В чем может быть проблема?

Ответы [ 4 ]

23 голосов
/ 05 ноября 2012

Обязательно запросите событие mouseMoved:

NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect |  
                         NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);

NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds]
                                                    options:options
                                                      owner:self
                                                   userInfo:nil];
11 голосов
/ 25 сентября 2011

Я не использовал mouseMoved: в реальном проекте (я просто немного поиграл с ним). Насколько я могу судить, mouseMoved: вызывается только тогда, когда ваш взгляд является первым респондентом, а затем не только когда мышь находится над вашим взглядом, но всегда, когда мышь движется. Возможно, вам лучше использовать NSTrackingArea. Обратитесь к Руководству по обработке событий Какао для получения дополнительной информации.

10 голосов
/ 26 января 2017

Как отмечают другие, NSTrackingArea является хорошим решением, и подходящим местом для установки области отслеживания является NSView.updateTrackingAreas(). Нет необходимости устанавливать содержащее NSWindow свойство setAcceptsMouseMovedEvents.

В 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)")
    }
}
1 голос
/ 01 апреля 2016

Просто если кто-нибудь еще столкнется с этим.Я столкнулся с проблемой, когда я подклассифицировал подкласс и пытался добавить область отслеживания для обоих классов (по двум разным причинам).

Если вы делаете что-то подобное, вам нужно убедиться, чтоваш mouseMoved: и т. д. позвоните в супер, или только один из ваших подклассов получит сообщение.

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