Próbuję dodać 2 UITapGestureRecognizers
do widoku, jedno dla zdarzeń z pojedynczym dotknięciem i jedno dla zdarzeń dotknięcia podwójnego. Rozpoznawanie z pojedynczym dotknięciem działa zgodnie z oczekiwaniami (samodzielnie). Ale wydaje mi się, że nie mogę uruchomić rozpoznawania podwójnego dotknięcia.
Próbowali eksperymentować z właściwości, takie jak: cancelsTouchesInView
, delaysTouchesBegan
a delaysTouchesEnded
jednak nadal nie działa.
Gdy stuknę dwukrotnie, aparat rozpoznawania pojedynczego dotknięcia będzie zawsze aktywowany, a zdarzenie podwójnego dotknięcia zostanie również wysłane do super widoku. Ale niestandardowy aparat rozpoznawania podwójnego dotknięcia nie wydaje się w ogóle otrzymywać powiadomień.
Dokumentacje wydają się sugerować, że wymienione powyżej 3 właściwości można wykorzystać do tego celu. Ale po prostu nie jestem pewien, jakie wartości należy ustawić i na których aparatach rozpoznających (pojedynczy, podwójny lub oba). Mam nadzieję, że ktoś zaznajomiony z tym może pomóc.
Poniżej znajduje się najnowszy zaktualizowany blok kodu.
// ****** 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
{
}
Odpowiedzi:
Uwaga: jeśli używasz,
numberOfTouchesRequired
to musi być.numberOfTouchesRequired = 1;
Dla Swift
źródło
Rozwiązanie Swift 3:
W linii kodu singleTap.require (toFail: doubleTap) wymuszamy na pojedynczym dotknięciu czekanie i upewnienie się, że zdarzenie tap nie jest dwukrotnym dotknięciem.
źródło
Musisz użyć metody requireGestureRecognizerToFail:. Coś takiego:
[singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];
źródło
// ---- najpierw musisz przydzielić gest podwójnego i pojedynczego dotknięcia ------- //
// ----------------------- liczba zaczepów ---------------- //
// ------- dodaj podwójne dotknięcie i pojedynczy gest dotknięcia widoku lub przycisku -------- //
źródło
Nie jestem pewien, czy dokładnie tego szukasz, ale zrobiłem pojedyncze / podwójne dotknięcia bez rozpoznawania gestów. Używam go w UITableView, więc użyłem tego kodu w metodzie didSelectRowAtIndexPath
Metody singleTap i doubleTap są po prostu void z NSIndexPath jako parametrem:
Mam nadzieję, że to pomoże
źródło
Rozwiązanie dla Swift 2:
źródło
Zaimplementowałem metody UIGestureRecognizerDelegate do wykrywania zarówno singleTap, jak i doubleTap.
Po prostu zrób to.
Następnie zaimplementuj te metody delegatów.
źródło
Niektóre widoki mają wbudowane narzędzia rozpoznawania podwójnego dotknięcia (
MKMapView
jako przykład). Aby obejść ten problem, musisz zaimplementowaćUIGestureRecognizerDelegate
metodęshouldRecognizeSimultaneouslyWithGestureRecognizer
i zwrócićYES
:Najpierw zaimplementuj podwójne i pojedyncze urządzenia rozpoznające:
A następnie zaimplementuj:
źródło
W nawiązaniu do komentarza @ stanley -
Nie próbuj używać gestów dotknięcia, aby wybrać wiersz do pracy,
UITableView
ponieważ ma już pełną obsługę dotknięcia ....Ale musisz ustawić opcję „Anuluje dotknięcia w widoku” na „NIE” w aparatach rozpoznawania gestów jednym dotknięciem, w przeciwnym razie zdarzenia dotknięcia nigdy nie zostaną wyświetlone.
źródło