Я пытаюсь добавить 2 UITapGestureRecognizers
к представлению, одно для одного касания и одно для событий двойного касания. Распознаватель с одним касанием работает как положено (сам по себе). Но я не могу заставить работать распознаватель двойного касания.
Пытались экспериментировать со свойствами , как: cancelsTouchesInView
, delaysTouchesBegan
и , delaysTouchesEnded
но до сих пор не работает.
При двойном касании распознаватель одиночного касания всегда будет активирован, и событие двойного касания также будет отправлено в супер-просмотр. Но пользовательский распознаватель двойного касания, похоже, вообще не уведомляется.
Документация, кажется, предполагает, что 3 свойства, упомянутые выше, могут быть использованы для этой цели. Но я просто не уверен, какие значения должны быть установлены и на какие распознаватели (одинарные, двойные или оба). Надеюсь, кто-то знакомый с этим может помочь.
Ниже приведен последний обновленный блок кода.
// ****** gesture recognizers ******
- (void)addSingleAndDoubleTapGestureRecognizersToView:(UIView *)view
{
// single tap
UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector(handleSingleTapOnView:)];
[singleTapRecognizer setNumberOfTouchesRequired:1];
[view addGestureRecognizer: singleTapRecognizer];
// double tap
UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector (handleDoubleTapOnView:)];
[doubleTapRecognizer setNumberOfTouchesRequired:2];
[singleTapRecognizer requireGestureRecognizerToFail: doubleTapRecognizer];
[view addGestureRecognizer: doubleTapRecognizer];
}
- (void)handleSingleTapOnView:(id)sender
{
}
- (void)handleDoubleTapOnView:(id)sender
{
}
Ответы:
Примечание: если вы используете
numberOfTouchesRequired
это должно быть.numberOfTouchesRequired = 1;
Для Свифта
источник
Решение Swift 3:
В строке кода singleTap.require (toFail: doubleTap) мы вынуждаем однократное нажатие и ждем, чтобы событие касания не было двойным касанием.
источник
Вам необходимо использовать requireGestureRecognizerToFail: метод. Что-то вроде этого:
[singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];
источник
// ---- во-первых, вы должны выделить двойной и один жест касания ------- //
// ----------------------- количество нажатий ---------------- //
// ------- добавление двойного касания и однократного касания к виду или кнопке -------- //
источник
Не уверен, что это именно то, что вы ищете, но я сделал одно / двойное нажатие без распознавания жестов. Я использую его в UITableView, поэтому я использовал этот код в методе didSelectRowAtIndexPath
Методы singleTap и doubleTap просто недействительны с NSIndexPath в качестве параметра:
Надеюсь, поможет
источник
Решение для Swift 2:
источник
Я реализовал методы UIGestureRecognizerDelegate для обнаружения как singleTap, так и doubleTap.
Просто сделай это.
Затем реализуйте эти методы делегата.
источник
Некоторые виды имеют встроенные распознаватели двойных касаний (
MKMapView
например). Чтобы обойти это, вам нужно реализоватьUIGestureRecognizerDelegate
методshouldRecognizeSimultaneouslyWithGestureRecognizer
и вернутьYES
:Сначала реализуйте свои двойные и одиночные распознаватели:
А затем реализовать:
источник
В отношении комментария @ Стэнли -
Не пытайтесь использовать жесты касаний для выбора строк для работы, так
UITableView
как они уже полностью обработаны касаниями ....Но вы должны установить «Отмена касаний в представлении» на «НЕТ» на ваших распознавателях жестов одним касанием, иначе оно никогда не получит события касания.
источник