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