2010-06-20 12 views
8

W mojej aplikacji dodałem nowe urządzenia do rozpoznawania gestów, które są dostępne w pakiecie SDK 3.2. Wszystko wydaje się działać poprawnie, a czas reakcji na ekranie był bardzo szybki. Ale z jakiegoś powodu, dodając requireGestureRecognizerToFail do niektórych moich gestów, pojawia się bardzo widoczne opóźnienie po uruchomieniu gestu. Poniżej znajduje się fragment kodu, którego używam do tworzenia Gesture Recognizers. Czy ktoś wie, dlaczego jest opóźnienie i jak mogę to naprawić? Używam requireGestureRecognizerToFail, aby zapobiec wyzwalaniu gestu SingleTap, gdy użytkownik wykonuje DoubleTap.Urządzenie Gest Recognizer firmy iPad - opóźniona odpowiedź

- (void)createGestureRecognizers { 

//Single Finger Double-Tap 
UITapGestureRecognizer *singleFingerDTap = [[UITapGestureRecognizer alloc] 
      initWithTarget:self action:@selector(handleSingleDoubleTap:)]; 
    singleFingerDTap.numberOfTapsRequired = 2; 
    [super addGestureRecognizer:singleFingerDTap]; 

//Single Finger Tap 
UITapGestureRecognizer *singleFingerTap = [[UITapGestureRecognizer alloc] 
       initWithTarget:self action:@selector(handleSingleTap:)]; 
    singleFingerTap.numberOfTapsRequired = 1; 
[singleFingerTap requireGestureRecognizerToFail:singleFingerDTap]; 
[self addGestureRecognizer:singleFingerTap]; 

//Two Finger Pan 
UIPanGestureRecognizer *panGesture2 = [[UIPanGestureRecognizer alloc] 
      initWithTarget:self action:@selector(handlePanGesture2:)]; 
    panGesture2.maximumNumberOfTouches = 2; 
[super addGestureRecognizer:panGesture2]; 

//Single Finger Pan 
UIPanGestureRecognizer *panGesture1 = [[UIPanGestureRecognizer alloc] 
      initWithTarget:self action:@selector(handlePanGesture1:)]; 
    panGesture1.maximumNumberOfTouches = 1; 
[panGesture1 requireGestureRecognizerToFail:panGesture2]; 
[super addGestureRecognizer:panGesture1]; 

[singleFingerDTap release]; 
[singleFingerTap release]; 
    [panGesture1 release]; 
[panGesture2 release]; 
} 
+0

Czy to oczekiwane zachowanie? Jeśli poprosisz go, aby opóźnił swoje działanie do czasu, aż kolejny gest się nie powiedzie, to nie może wystrzelić, dopóki to się nie skończy. Dwa krany mają między nimi przedział czasowy (dotknięcia! = Dotknięcia), więc potrzebujesz tego przedziału czasowego do przejścia. – Eiko

+0

Dzięki, to ma sens! – Maddoxx

Odpowiedz

6

Jeśli chcesz odróżnić pojedynczego i podwójnego dotknięcia, trzeba czekać na tyle długo, aby dowiedzieć się, że nie nadchodzi drugi kranu zanim można nazwać to jeden z kranu. Alternatywą byłoby zaprojektowanie wszystkich pojedynczych czynności dotknięcia w taki sposób, aby można je było asynchronicznie anulować lub przywrócić po wykryciu podwójnego dotknięcia.

Na przykład, jeśli masz pojedyncze dotknięcie, zmieniaj strony i kliknij dwukrotnie powiększenie, musisz animować stronę zmieniającą się po jednym dotknięciu, a następnie odwrócić animację i powiększenie, gdy zostanie wykryte drugie dotknięcie. Do tego czasu widok obsługiwany jednym dotknięciem może się przesunąć. W większości przypadków jest to więcej kłopotów i zamieszania niż warto.

+1

Teraz, gdy myślę o tym, co powiedziałeś, ma to sens, że jest opóźnienie. Ponieważ potrzebuję więcej odpowiedzi w czasie rzeczywistym, będę musiał wrócić do samodzielnego obsługiwania zdarzeń Touch. Dzięki! – Maddoxx