Dlaczego UIViewController dotykaBegan, touchesMoved & touchesKoniec jest wywoływany tylko wtedy, gdy pierwsze z dwóch dotknięć zaczyna się, porusza lub kończy?
Mam problem z obsługą więcej niż jednego dotknięcia poprzez metody touchesBegan / Moved / Ended UIViewController. Widzę również to samo zachowanie w aplikacji cocos2d (używając ccTouchesBegan / Moved / Ended), więc myślę, że to pytanie można zastosować do wszystkich operacji dotykowych w iOS. Poniżej umieściłem kod, którego używam, a następnie wyniki, które widzę.
Wszystkie metody są implementowane na podklasie UIViewController.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Touches Began");
[self logTouchesFor: event];
[super touchesEnded: touches withEvent: event];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Touches Moved");
[self logTouchesFor: event];
[super touchesEnded: touches withEvent: event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Touches Ended");
[self logTouchesFor: event];
[super touchesEnded: touches withEvent: event];
}
-(void)logTouchesFor:(UIEvent *)event
{
int count = 1;
for (UITouch *touch in event.allTouches)
{
CGPoint location = [touch locationInView: self.view];
NSLog(@"%d: (%.0f, %.0f)", count, location.x, location.y);
count++;
}
}
Teraz interesujące wyniki ...
Pojedyncze dotknięcia działają zgodnie z oczekiwaniami
Powiedzmy, że dotykam ekranu kciukiem. Widzę w oknie wyjściowym, że touchesBegan został wywołany zgodnie z oczekiwaniami. Poruszam kciukiem, a dotykam Przeniesiono ruch. Potem podnoszę kciuk z ekranu i dzwoni touchesEnded. Wszystko to zgodnie z oczekiwaniami, uwzględniam je w pytaniu jako przypadek kontrolny - po to, aby było jasne, że mój kontroler widoku odbiera zdarzenia dotykowe i nie przegapiłem żadnegovc.view.userInteractionEnabled = YES
gdziekolwiek.
Drugi dotyk nie powoduje dotknięćBegan, touchesMoved lub touchesEnded, aby zadzwonić
To jest najbardziej interesujący. Powiedzmy, że dotykam ekranu kciukiem (nazywamy go touchesBegan) i trzymam go nadal na ekranie. Następnie dotykam palcem wskazującym gdzieś indziej na ekranie, trzymając kciuk w tym samym miejscu. TouchesBegan nie jest wywoływany. Powiedzmy, że poruszam palcem wskazującym, zachowując absolutnie nieruchomy kciuk (może to być trudne, ale możliwe). TouchesMoved nie jest wywoływany. Następnie podnoszę palec wskazujący z ekranu. TouchesEnded nie jest wywoływany. W końcu poruszam kciukiem, a dotknięto Moved. Następnie podnoszę kciuk z ekranu i nazywam touchesEnded.
Żeby było jasne: ustawiłemself.view.multipleTouchEnabled = YES
w moimviewDidLoad
metoda.
Informacje o drugim dotknięciu są dostępne, zapewniając pierwsze ruchy dotykowe
Tym razem robię coś bardzo podobnego do powyższego przykładu. Dotykam ekranu kciukiem, a następnie palcem wskazującym, nie odrywając kciuka. TouchesBegan jest wywoływany, gdy mój kciuk uderza w ekran, ale nie mój palec wskazujący. Teraz poruszam kciukiem, a dotknięto Moved. Nie tylko to, ale w tablicy event.allTouches znajdują się dwa akcenty (i tak, drugie dotknięcie to miejsce, w którym mógłbym się tego spodziewać). Oznacza to, że system jest świadomy, że dotknąłem ekranu po raz drugi, ale nie otrzymuję powiadomienia za pomocą metod obsługi dotyku w moim kontrolerze widoku.
Jak mogę zostać powiadomiony o zmianach w drugim dotknięciu?
Naprawdę chciałbym być w stanie reagować na zmiany w lokalizacji lub stanie drugiego dotyku w miarę ich występowania, a nie wtedy, gdy zmienia się także pierwszy dotyk. Często nie będzie to problemem, ponieważ bardzo trudno jest zmienić jeden dotyk bez wpływu na drugi, ale mam przynajmniej jedną sytuację, w której może to być problem. Czy brakuje mi czegoś oczywistego? Czy ktoś zauważył to zachowanie lub miał z nim problemy?
Jeśli jest to istotne, używam iPhone'a 3GS z systemem iOS 5.1.