2012-03-20 18 views
7

Tworzę niestandardowy UIView i dodam na nim UITapGestureRecognizer. Mam funkcję obsługi gestu dotykowego. Ale w tym samym czasie chcę, aby moje UIView słuchać dotknięćBegan & dotknięć metod. Zaimplementowałem metodę gestureRecognizer: shouldReceiveTouch: metoda również nie dotyka wywołań metody BEGAN/touchesEnded. Jakąkolwiek wskazówkę dlaczego?Słuchanie zdarzenia UITouch wraz z UIGestureRecognizer

Wewnątrz mojego zwyczaju UIView

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)iGestureRecognizer shouldReceiveTouch:(UITouch *)iTouch { 
    return YES; 
} 

Wewnątrz moim zdaniem regulatora

MyCustomView aCustomView = [[[MyCustomView alloc] init] autorelease]; 
       UIGestureRecognizer *myGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; 
[aCustomView addGestureRecognizer:myGestureRecognizer]; 
       [myGestureRecognizer release]; 
+0

Zawsze myślałem touchesBegan stosowana tylko do widzenia Mistrza viewController użytkownika. – CodaFi

Odpowiedz

10

Musisz ustawić cancelsTouchesInView (i prawdopodobny delaysTouchesBegan i delaysTouchesEnded) do NO do rozpoznawania gestów. Domyślnym zachowaniem aparatu do rozpoznawania gestów jest unikanie sytuacji, w których zarówno on, jak i widok przetwarzają dotyk. Te ustawienia pozwalają precyzyjnie dostroić to zachowanie.

+0

Na pewno żałuję, że nie otrzymałem takiego zachowania, o którym wspomniałeś. Używam domyślnych ustawień, ale moje metody dotykowe wciąż są wywoływane. Zobacz moje pytanie tutaj: http://stackoverflow.com/questions/15869944/how-to-prioritize-gesture-recognizers-and-touches-in-a-viewview – johnbakers

+0

@RobNapier nie może umieścić cancelsTouchesInView być połączone z moim problemem tutaj : https://stackoverflow.com/questions/46170876/random-crash-on-pickerview-didselect-cfrunloop-is-calling-out-to-a-source1-p?noredirect=1#comment79305779_46170876 – user2363025

0

Jak wcześniej wspomniano, musisz ustawić właściwość cancelTouchesInView na NO na swoim UITapGestureRecognizer.

Od docs Apple:

cancelsTouchesInView-Jeśli rozpoznawania gest ujmuje swój gest, to usuwa powiązanie pozostałe dotyka tego gestu z ich punktu widzenia (tak okno nie będzie im dostarczać). Okno anuluje wcześniej podane dotknięcia za pomocą wiadomości (touchesCancelled: withEvent :). Jeśli urządzenie rozpoznające gesty nie rozpoznaje gestu, widok otrzymuje wszystkie dotknięcia w sekwencji wielokrotnego dotyku.

Dalsze czytanie: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizer_Class/