8

Mam kilka s w UIView w ramach UIScrollView. Próbuję dodać czytnik zaczepów do widoku przewijania. Rozpoczyna się rozpoznawanie zaczepów, ale teraz żaden z moich przycisków nie działa.iOS5 UITapRecognizer dla UIScrollView ingerencji w przyciski. Jak naprawić?

Wiem, że w iOS5, UIScrollView może jakoś przekazać zdarzenie dotyku do hierarchii kontrolnej po zakończeniu pracy z nim. Ktoś może mi pomóc dowiedzieć się, jak to zrobić?

Odpowiedz

15

Ustawia wartość UIGestureRecognizer właściwości cancelsTouchesInView na NIE.

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                          action:@selector(singleTap:)]; 
singleTapGestureRecognizer.numberOfTapsRequired = 1; 
singleTapGestureRecognizer.enabled = YES; 
singleTapGestureRecognizer.cancelsTouchesInView = NO; 
[tapableView addGestureRecognizer:singleTapGestureRecognizer]; 
[singleTapGestureRecognizer release]; 

Od UIGestureRecognizer Class Reference

wartość logiczną wpływając czy akcenty są dostarczane do widzenia gdy gest został rozpoznany.

Gdy ta właściwość jest TAK (ustawienie domyślne), a odbiornik ujmuje swój gest, dotyka tego gestu, które są Oczekuje nie są dostarczane do widzenia i poprzednio dostarczony dotyka są anulowane przez touchesCancelled: withEvent: wiadomość wysłane do widoku . Jeśli urządzenie rozpoznające gest nie rozpoznaje jego gestu lub jeśli wartością tej właściwości jest NIE, widok odbiera wszystkie dotknięcia w sekwencji wielodotykowej .

+1

dokładnie to, co potrzebne, dzięki za szybką odpowiedź! :) –

+0

Powoduje to, że zarówno przycisk AND wykrywacz gestów strzela ... – hfossli

+0

@hfossli correct. – Till

0

Można również użyć metody z UIGestureRecognizerDelegate, która jest udokumentowana heregestureRecognizer:shouldReceiveTouch:, aby osiągnąć to samo. Oferuje trochę więcej elastyczności, na przykład, jeśli chcesz anulować pewne dotknięcia, ale nie inne. Oto przykład,

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[UIButton class]]) return NO; 

    return YES; 
} 
+0

To właściwie nie jest to samo. Po zwróceniu NIE, urządzenie rozpoznające gest nie obsługuje dotyku. Po powrocie TAK, UIView nie obsługuje dotyku. cancelsTouchesInView ustawiony na NIE oznacza, że ​​zarówno rozpoznawanie gestów, jak i widok otrzymują dotyk. – Till

+0

Masz rację. Jeśli chcesz osiągnąć oba, możesz potencjalnie obsługiwać zdarzenie dotykowe tutaj * przed * zwracaniem NIE. – john

2

Dla mnie combo z powyższych odpowiedzi pracował

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userDidTap:)]; 
tapRecognizer.cancelsTouchesInView = YES; 
tapRecognizer.delegate = self; 
[tapRecognizer requireGestureRecognizersToFail:self.scrollView.gestureRecognizers]; 
[self.view addGestureRecognizer:tapRecognizer]; 

-

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[UIButton class]] || [touch.view isKindOfClass:[UIButton class]]) 
    { 
     return NO; 
    } 
    return YES; 
} 
+0

Spowoduje to niepowodzenie przycisku rozpoznawania gestów na przycisku - nie wiesz, jak to koreluje z pytaniem. – Till

+0

Tak, będzie. W moim przypadku to pożądane zachowanie. Pytanie nie jest jasne w tym punkcie do mojego zrozumienia. – hfossli