У меня есть собственный подкласс 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 все еще мог распознавать щипки, когда касания начинаются неодновременно?