mouseMoved未调用

时间:2011-09-25 04:33:38

标签: xcode cocoa nsview osx-lion nswindow

我有一个子类NSView,它是子类NSDocument的.xib文件的一部分,它通过NSDocumentController的{​​{1}}的默认行为生效方法。在此子类openDocument:中,我实现了方法NSView,其中调用了视图awakeFromNib NSWindow方法,而setAcceptsMouseMovedEvents:YES则返回acceptsFirstMouse: }。但是当我将鼠标移到它上面时,我的YES方法实现了我的子类mouseMoved:。可能是什么问题?

6 个答案:

答案 0 :(得分:23)

请务必请求发送mouseMoved事件:

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

NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds]
                                                    options:options
                                                      owner:self
                                                   userInfo:nil];

答案 1 :(得分:11)

我没有在一个真实的项目中使用mouseMoved:(我刚刚玩了一下)。据我所知,mouseMoved:仅在您的视图是第一响应者时调用,然后不仅在鼠标位于视图上时调用,而且始终在鼠标移动时调用。你可能最好使用NSTrackingArea。有关详细信息,请查看Cocoa Event Handling Guide

答案 2 :(得分:9)

正如其他人所说,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)")
    }
}

答案 3 :(得分:1)

只是因为其他人遇到这个问题。我遇到了一个问题,我在那里继承了一个子类,并试图在两个类中添加一个跟踪区域(原因有两个)。

如果你正在做这样的事情,你需要确保你的mouseMoved:等调用超级,或者只有一个子类会收到消息。

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

答案 4 :(得分:0)

@jbouwman的答案的降级版本:

override func updateTrackingAreas() {
    self.addTrackingArea(NSTrackingArea(rect: self.bounds, options: [.mouseEnteredAndExited, .mouseMoved, .activeInKeyWindow], owner: self, userInfo: nil))
}

答案 5 :(得分:0)

oc 版本:

    - (void)updateTrackingAreas {
        [self initTrackingArea];
    }
    
    -(void) initTrackingArea {
        NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect |
                                 NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);
    
        NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds]
                                                            options:options
                                                              owner:self
                                                           userInfo:nil];
        
        [self addTrackingArea:area];
    }
相关问题