Xcode mouseMoved未调用
我有一个子类Xcode mouseMoved未调用,xcode,cocoa,nsview,osx-lion,nswindow,Xcode,Cocoa,Nsview,Osx Lion,Nswindow,我有一个子类NSView,它是子类NSDocument的.xib文件的一部分,通过NSDocumentController的openDocument:方法的默认行为,它变得活跃起来。在这个子类NSView中,我实现了方法awakeFromNib,其中调用视图的NSWindowsetAcceptsMouseMovedEvents:YES方法,并调用acceptsFirstMouse:,返回YES。但是我的mouseMoved:子类NSView的方法实现在我将鼠标移到上面时不会被调用。有什么问题吗?
NSView
,它是子类NSDocument
的.xib文件的一部分,通过NSDocumentController
的openDocument:
方法的默认行为,它变得活跃起来。在这个子类NSView
中,我实现了方法awakeFromNib
,其中调用视图的NSWindow
setAcceptsMouseMovedEvents:YES
方法,并调用acceptsFirstMouse:
,返回YES
。但是我的mouseMoved:
子类NSView
的方法实现在我将鼠标移到上面时不会被调用。有什么问题吗?我没有在实际项目中使用mouseMoved:
(我只是稍微玩弄了一下)。据我所知,mouseMoved:
仅在视图是第一响应者时调用,并且不仅在鼠标位于视图上方时调用,而且总是在鼠标移动时调用。您最好使用NSTrackingArea。查看以获取更多信息。确保请求发送mouseMoved事件:
NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect |
NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);
NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds]
options:options
owner:self
userInfo:nil];
以防万一有人碰到这件事。我遇到了一个问题,我正在对一个子类进行子类化,并试图为这两个类添加一个跟踪区域(出于两个不同的原因) 如果您正在执行类似操作,则需要确保您的
mouseMoved:
等调用进入super,否则只有一个子类会收到消息
- (void) mouseMoved: (NSEvent*) theEvent
{
// Call the super event
[super mouseMoved: theEvent];
}
正如其他人所指出的,
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)")
}
}
@jbouwman答案的非屏蔽版本:
override func updateTrackingAreas() {
self.addTrackingArea(NSTrackingArea(rect: self.bounds, options: [.mouseEnteredAndExited, .mouseMoved, .activeInKeyWindow], owner: self, userInfo: nil))
}
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];
}
这并不能真正回答问题。请参见下文。您需要安装一个跟踪区域,以便开始接收这些事件。我不确定它是否应该是int,而是NSInteger类型,或者typedef最好是NSTrackingAreaOptions,它的可读性更高,并且保证是正确的类型。这是正确的,但没有给出任何上下文来说明应该在哪里调用它。有关该信息,请参阅。根据您的用例,您可能可以使用MouseDragged。这可以在没有NSTrackingArea的情况下工作,但它仅在鼠标按下时触发。.mouseenteredexited、.mouseMoved、.activeInKeyWindow=>.mouseenteredexited、.mouseMoved、.activeInKeyWindow此示例代码按天保存。直到更新跟踪区域。谢谢但是但是哭泣