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.

questionAnswers(1)

yourAnswerToTheQuestion