Как определить, была ли нажата клавиша CMD или Shift во время события NSPressGestureRecognizer?

В обработчике распознавателя жестов нажатия я пытаюсь выяснить, была ли нажата CMD или Shift, например:

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

Однако флаг правильно установлен только в методе обработчика событий keyDown или keyUp. NSGestureRecognizer, похоже, не раскрывает объект события, поэтому я получаю его currentEvent из NSApp. Что мне не хватает?


person iamjustaprogrammer    schedule 22.08.2015    source источник
comment
Ты прав. Проверьте keyDown класса NSGestureRecognizer: Распознаватель жестов отслеживает события, происходящие в его представлении (и любых подпредставлениях), но не принимает участия в самой цепочке респондента. Распознаватель жестов получает события до того, как это сделают какие-либо представления. Используйте свойство delaysKeyEvents, чтобы контролировать, передается ли событие в представление.   -  person comrade    schedule 23.08.2015


Ответы (2)


Вместо подкласса вы можете использовать NSGestureRecognizerDelegate вот так:

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

Технически это будет распознавать только клавиши-модификаторы, удерживаемые в момент нажатия мыши, но с точки зрения пользовательского интерфейса это может быть то, что вам нужно в любом случае.

person Taylor    schedule 05.05.2018

Попробуйте создать подкласс 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
}

}

person DownEast    schedule 29.09.2016