UIPinchGestureRecognizer не срабатывает после сбоя пользовательского UIGestureRecognizer

У меня есть собственный подкласс UIGestureRecognizer, который обнаруживает определенный вид перетаскивания одним пальцем. В той же сцене у меня также есть UIPinchGestureRecognizer, который обнаруживает сжатие двумя пальцами.

Проблема возникает, когда пользователь делает жест щипка, но опускает один палец на мгновение раньше другого: пользовательский распознаватель жестов видит одно касание и задействуется (устанавливает свое состояние в .began), а распознаватель щипка — нет. Когда добавляется второе касание, пользовательский распознаватель замечает это и переключает свое состояние на .failed. Но уже слишком поздно, и распознаватель жестов щипка не улавливает его.

Вот код пользовательского подкласса UIGestureRecognizer:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
    super.touchesBegan(touches, with: event)
    guard touches.count == 1 else {
        state = .failed
        return
    }
    state = .began
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
    super.touchesMoved(touches, with: event)
    guard touches.count == 1 else {
        state = .failed
        return
    }
    // do gesture recognizer stuff here
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
    super.touchesEnded(touches, with: event)
    state = .ended
}

Я пробовал с cancelsTouchesInView, установленным на false, и с delaysTouchesBegan, установленным на true для пользовательского распознавателя жестов. Ни то, ни другое не повлияло на это поведение.

Когда я использую UIPinchGestureRecognizer с UIPanGestureRecognizer, у меня нет этой проблемы, что заставляет меня думать, что это не предполагаемое поведение.

Что не так с моим кодом сбоя UIGestureRecognizer и как его исправить, чтобы UIPinchGestureRecognizer все еще мог распознавать щипки, когда касания начинаются неодновременно?


person Robert    schedule 09.06.2017    source источник
comment
вы нашли решение этого?   -  person agibson007    schedule 30.10.2018
comment
@ agibson007 К сожалению, нет; требования моего проекта изменились, поэтому мне не понадобился пользовательский подкласс, и я никогда не удосужился дополнить его.   -  person Robert    schedule 30.10.2018


Ответы (1)


Попробуйте использовать протокол UIGestureRecognizerDelegate для реализации gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:). Это может позволить вам одновременно распознавать два жеста.

class MyVC: UITableViewController, UIGestureRecognizerDelegate {

    override func viewDidLoad() {
        let pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(handlePinchFrom))
        pinchGestureRecognizer.delegate = self
        view.addGestureRecognizer(pinchGestureRecognizer)
    }

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}
person peacetype    schedule 30.12.2017