Обнаружение пальца вверх/вниз UITapGestureRecognizer

Как я могу узнать, когда палец опущен, а когда он работает с UITapGestureRecognizer?
documentation говорит, что я должен обрабатывать только UIGestureRecognizerStateEnded, так что это означает, что есть UIGestureRecognizerStateBegin, когда палец опущен, но все, что я получаю, это UIGestureRecognizerStateEnded.
Код, который я использую для регистрации распознавателя:

[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)]

Ответ 1

UITapGestureRecognizer является дискретным распознавателем жестов и, следовательно, никогда не переходит в начальные или измененные состояния. Из справочника класса UIGestureRecognizer:

Переход дискретных жестов из Возможного для распознанного (UIGestureRecognizerStateRecognized) или Failed (UIGestureRecognizerStateFailed), в зависимости от того, являются ли они успешно интерпретировать жест или нет. Если распознаватель жестов переходы к распознанному, он отправляет сообщение своего действия своей цели.

(Помните, конечно, что UIGestureRecognizerStateRecognized == UIGestureRecognizerStateEnded).

В документах говорится, что вы должны проверить состояние распознавателя жестов, чтобы убедиться, что оно находится в его законченном состоянии, прежде чем вы запустите свой код, чтобы сказать, что он был распознан. Они не говорят, что жест нажатия на самом деле переходит к начальным или измененным состояниям (хотя я признаю, что документы немного вводят в заблуждение на используемом языке!).

Если вы хотите проверить событие finger down для распознавателя жестов, я бы порекомендовал просто использовать touchesBegan:withEvent:, так как это то, что вы действительно в любом случае.

Ответ 2

Вы можете переопределить метод делегата -(BOOL)gestureRecognizer:shouldReceiveTouch:.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    NSLog(@"Hello from press down");

    return YES;
}