Macos 如何检测NSPressGestureRecognitor事件期间是否按下了CMD或Shift键?
在按下手势识别器的处理程序中,我尝试找出是否按下了CMD或Shift,如下所示:Macos 如何检测NSPressGestureRecognitor事件期间是否按下了CMD或Shift键?,macos,cocoa,appkit,nsevent,Macos,Cocoa,Appkit,Nsevent,在按下手势识别器的处理程序中,我尝试找出是否按下了CMD或Shift,如下所示: - (void)handlePress:(NSPressGestureRecognizer*)gr { NSEventModifierFlags flags = [[NSApp currentEvent] modifierFlags]; if (flags & NSCommandKeyMask) { NSLog(@"CMD pressed"); } } 但是,该标志
- (void)handlePress:(NSPressGestureRecognizer*)gr {
NSEventModifierFlags flags = [[NSApp currentEvent] modifierFlags];
if (flags & NSCommandKeyMask) {
NSLog(@"CMD pressed");
}
}
但是,该标志仅在keyDown或keyUp事件处理程序方法中正确设置。NSGestureRecognizer似乎没有公开事件对象,因此我从NSApp获取了currentEvent。我遗漏了什么?尝试子类化NpressgestureRecognitor,以从鼠标按下事件中收集修改器标志
class PressGestureRecognizer: NSPressGestureRecognizer {
var modifierFlags = NSEventModifierFlags (rawValue: 0)
override func flagsChanged (with event: NSEvent) {
super.flagsChanged (with: event)
modifierFlags = event.modifierFlags
}
override func mouseDown (with event: NSEvent) {
super.mouseDown (with: event)
modifierFlags = event.modifierFlags
}
}您可以像这样使用
nsgestureRecognitizerDelegate
而不是子类化:
extension ViewController : NSGestureRecognizerDelegate
{
func gestureRecognizer(_ gestureRecognizer: NSGestureRecognizer,
shouldAttemptToRecognizeWith event: NSEvent) -> Bool {
return event.modifierFlags.contains(.command)
}
}
从技术上讲,这只会识别鼠标按下时所持的修改键,但从用户界面的角度来看,这可能正是您想要的。您是对的。检查NSGestureRecognizer类的方法说明:“手势识别器监视其视图(和任何子视图)中发生的事件,但不参与响应器链本身。手势识别器在任何视图之前接收事件。使用delaysKeyEvents属性控制事件是否传播到视图。”