如何检测NSPressGestureRecognizer事件期间是否按下了CMD或Shift键?

时间:2015-08-22 18:54:50

标签: macos cocoa appkit nsevent

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

- (void)handlePress:(NSPressGestureRecognizer*)gr {
    NSEventModifierFlags flags = [[NSApp currentEvent] modifierFlags];
    if (flags & NSCommandKeyMask) {
        NSLog(@"CMD pressed");
    }
}

但是,只能在keyDown或keyUp事件处理程序方法中正确设置该标志。 NSGestureRecognizer似乎没有暴露事件对象,因此我从NSApp获取currentEvent。我错过了什么?

2 个答案:

答案 0 :(得分:0)

尝试继承NSPressGestureRecognizer以从鼠标按下事件中收集修饰符标记。

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
}

}

答案 1 :(得分:0)

您可以使用NSGestureRecognizerDelegate代替子类,而不是子类:

extension ViewController : NSGestureRecognizerDelegate
{
    func gestureRecognizer(_ gestureRecognizer: NSGestureRecognizer,
                           shouldAttemptToRecognizeWith event: NSEvent) -> Bool {
        return event.modifierFlags.contains(.command)
    }
}

从技术上讲,这只能识别鼠标停止时保存的修饰键,但从UI的角度来看,无论如何都可能是你想要的。