2016-09-07 17 views
0

Мне нужно, чтобы мой NSButton отвечал на обычные клики, а также на длительные нажатия. Я добавляю NSPressGestureRecognizer так:NSPressGestureRecognizer вызывается до минимумаPressDuration

override func viewDidLoad() { 
    super.viewDidLoad() 

    let gr = NSPressGestureRecognizer() 
    gr.minimumPressDuration = 1 
    gr.action = #selector(handleLongPress) 
    button.addGestureRecognizer(gr) 
} 

func handleLongPress(gr: NSPressGestureRecognizer) { 

    if gr.state == .Began { 
     Swift.print("long press") 
    } 

} 

К сожалению, handleLongPress случайно срабатывает даже при коротких одиночных щелчков или двойных щелчков. Это происходит, даже если я установил minimumPressDuration в более высокие значения.

Я пробовал играть с shouldBeRequiredToFailByGestureRecognizer, но это не решение проблемы.

Есть ли что-то у меня с кодом?

ответ

0

Я решил эту проблему путем обработки нескольких распознавателей жестов:

класс должен реализовать NSGestureRecognizerDelegate

var singleClick:NSClickGestureRecognizer? 
var longClick:NSPressGestureRecognizer? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    longClick = NSPressGestureRecognizer() 
    longClick!.minimumPressDuration = 1 
    longClick!.action = #selector(handleGestureLong) 
    longClick!.delegate = self 

    singleClick = NSClickGestureRecognizer() 
    singleClick?.numberOfClicksRequired = 1 
    singleClick!.action = #selector(handleGestureSingle) 
    singleClick!.delegate = self 

    btn.addGestureRecognizer(longClick!) 
    btn.addGestureRecognizer(singleClick!) 

} 

func gestureRecognizer(gestureRecognizer: NSGestureRecognizer, shouldRequireFailureOfGestureRecognizer otherGestureRecognizer: NSGestureRecognizer) -> Bool { 
    if gestureRecognizer == singleClick && otherGestureRecognizer == longClick { 
     return false 
    } 
    return true 
} 

func handleGestureSingle(gr: NSClickGestureRecognizer) { 

    switch gr.state { 

    case .Ended: 
     print("single click") 
     break 
    default: 
     break 

    } 
} 

func handleGestureLong(gr: NSPressGestureRecognizer) { 

    switch gr.state { 

    case .Began: 
     print("long click") 
     break 
    default: 
     break 

    } 
}