Если мы установим зависимость распознавателя жестов A, требующую сбоя B, означает ли это, что распознаватель A не получит событие до сбоя B?

#ios #uikit #uigesturerecognizer

Вопрос:

https://developer.apple.com/documentation/uikit/uigesturerecognizerdelegate/1624229-gesturerecognizer Например, если я задам делегат распознавателя жестов A и вернусь true , когда otherGestureRecognizer будет распознаватель жестов B .

 optional func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, 
         shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool
 

Означает ли это , что распознаватель жестов A даже не получит событие типа touchBegan touchMoved или touchEnded до тех пор, пока распознаватель B не выйдет из строя? Или он по-прежнему будет функционировать как обычно, просто результат A recognized будет получен только в случае B сбоя?

Ответ №1:

Даже если один распознаватель жестов требует, чтобы другой вышел из строя, он все равно может получать события касания (например touchesBegan , touchesMoved и т.д.) До того, как жест будет распознан.

Как уже было сказано, идея распознавателей жестов состоит в том, чтобы отвлечь нас от этих предварительно распознанных событий прикосновения. Большую часть времени мы используем существующие конкретные распознаватели жестов (например UITapGestureRecognizer , UILongPressGestureRecognizer и т. Д.). Как таковые, мы обычно не имеем дело с базовыми событиями касания, а скорее указываем цель/селектор (или подключаем @IBAction в IB) для метода , который будет вызван после распознавания жеста. Соответствующий метод действия вызывается только после распознавания жеста, что означает, что будет распознан только один распознаватель жестов. Например, если A требует, чтобы B потерпел неудачу, вы увидите либо действие для вызываемого A, либо B, но не оба.

Таким образом, при реализации нашего собственного пользовательского распознавателя жестов мы будем обрабатывать события касания (в том числе до того, как жест был распознан), но, как правило, мы просто будем использовать действие распознавателя жестов и увидим одно или другое.

Излишне говорить, что вместо того, чтобы требовать, чтобы один из них потерпел неудачу, вы можете в качестве альтернативы указать, что одновременные жесты могут быть распознаны с gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:) помощью . Таким образом, можно вести себя как угодно, в зависимости от потребностей вашего приложения.