我目前在mouseDrag函数中接受nextEvent
while true {
guard let nextEvent = self.window?.nextEvent(matching: [.leftMouseDragged, .leftMouseUp, .rightMouseUp]) else {
continue
}
switch nextEvent.type {
case .leftMouseDragged:
self.cursorUpdate(with: nextEvent)
self.mouseDragged(with: nextEvent)
case .rightMouseUp:
continue
default:
self.mouseUp(with: nextEvent)
return
}
}
我只是想在此期间禁用右键单击。但是,使用此实现,右键单击只会排队,并在循环结束后被调用。
如何完全禁止注册右键单击?
最佳答案
尝试将.rightMouseDown
和.rightMouseDragged
添加到匹配的掩码中。是.rightMouseDown
事件使AppKit显示上下文菜单。
guard let nextEvent = self.window?.nextEvent(matching: [.leftMouseDragged, .leftMouseUp, .rightMouseDown, .rightMouseDragged, .rightMouseUp]) else {
continue
}
您可能还考虑切换到
NSWindow.trackEvents(matching:timeout:mode:handler:)
而不是编写自己的循环: window.trackEvents(matching: [.leftMouseDragged, .leftMouseUp, .rightMouseDown, .rightMouseDragged, .rightMouseUp], timeout: NSEvent.foreverDuration, mode: .eventTrackingRunLoopMode) { (event, outStop) in
guard let event = event else { return }
switch event.type {
case .rightMouseDown, .rightMouseDragged, .rightMouseUp: return
case .leftMouseDragged:
self.cursorUpdate(with: event)
self.mouseDragged(with: event)
case .leftMouseUp:
self.mouseUp(with: event)
outStop.pointee = true
default:
break
}
}
使用
trackEvents
可让AppKit运行主运行循环,因此计时器和观察者可以继续触发(如果已为.eventTrackingRunLoopMode
安排了时间)。关于swift - 在appkit中禁用右键单击,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49140021/