Macos 如何检测NSPressGestureRecognitor事件期间是否按下了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"); } } 但是,该标志

在按下手势识别器的处理程序中,我尝试找出是否按下了CMD或Shift,如下所示:

- (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属性控制事件是否传播到视图。”