Warum werden UIViewController touchesBegan, touchesMoved & touchesEnded nur aufgerufen, wenn die erste von zwei Berührungen beginnt, sich bewegt oder endet?

Ich habe ein Problem mit der Behandlung von mehr als einer Berührung durch die touchesBegan / Moved / Ended-Methoden von UIViewController. Ich sehe das gleiche Verhalten auch in einer cocos2d-App (mit ccTouchesBegan / Moved / Ended), sodass ich denke, dass diese Frage auf alle Berührungsvorgänge in iOS angewendet werden kann. Ich habe den Code, den ich verwende, unten angegeben, gefolgt von den Ergebnissen, die ich sehe.

Alle Methoden sind in einer UIViewController-Unterklasse implementiert.

- (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++;
    }
}

Nun zu den interessanten Ergebnissen ...

Einzelne Berührungen funktionieren wie erwartet

Nehmen wir an, ich berühre den Bildschirm mit dem Daumen. Ich sehe im Ausgabefenster, dass touchesBegan wie erwartet aufgerufen wurde. Ich bewege meinen Daumen und touchesMoved wird angerufen. Dann hebe ich meinen Daumen vom Bildschirm und touchesEnded wird angerufen. All dies ist wie erwartet, ich nehme es in die Frage als Kontrollfall auf - nur um klar zu sein, dass mein View Controller Berührungsereignisse empfängt und ich eine nicht verpasst habevc.view.userInteractionEnabled = YES irgendwo.

Die zweite Berührung bewirkt nicht, dass touchesBegan, touchesMoved oder touchesEnded angerufen werden

Dies ist das interessanteste. Nehmen wir an, ich berühre den Bildschirm mit dem Daumen (touchesBegan heißt) und halte ihn immer noch auf dem Bildschirm. Dann berühre ich mit meinem Zeigefinger irgendwo anders auf dem Bildschirm, während ich meinen Daumen an derselben Stelle halte. TouchesBegan wird nicht aufgerufen. Nehmen wir an, ich bewege meinen Zeigefinger und halte dabei meinen Daumen absolut ruhig (dies kann schwierig sein, ist aber möglich). TouchesMoved wird nicht aufgerufen. Dann hebe ich meinen Zeigefinger vom Bildschirm. TouchesEnded wird nicht aufgerufen. Zum Schluss bewege ich meinen Daumen und berühre Bewegte wird gerufen. Dann hebe ich meinen Daumen vom Bildschirm und berühre Ended heißt.

Nur um klar zu sein: Ich habe gesetztself.view.multipleTouchEnabled = YES in meinemviewDidLoad Methode.

Informationen über die zweite Berührung sind verfügbar und stellen die ersten Berührungsbewegungen bereit

Diesmal mache ich etwas sehr ähnliches wie im Beispiel oben. Ich berühre den Bildschirm mit meinem Daumen und zeige dann mit dem Finger, während ich meinen Daumen ruhig halte. TouchesBegan wird aufgerufen, wenn mein Daumen auf den Bildschirm trifft, nicht jedoch mein Zeigefinger. Jetzt bewege ich meinen Daumen und touchesMoved heißt. Nicht nur das, es gibt auch zwei Berührungen im event.allTouches-Array (und ja, die zweite Berührung ist genau dort, wo ich es erwarten würde). Dies bedeutet, dass dem System bekannt ist, dass ich den Bildschirm ein zweites Mal berührt habe, aber nicht über die Berührungsmethoden auf meinem View-Controller benachrichtigt werde.

Wie kann ich über Änderungen an der zweiten Berührung benachrichtigt werden?

Ich möchte wirklich in der Lage sein, auf Änderungen der Position oder des Zustands der zweiten Berührung zu reagieren, wenn sie eintreten, und nicht, wenn sich auch die erste Berührung ändert. Meistens ist dies kein Problem, da es sehr schwierig ist, eine Berührung zu ändern, ohne die andere zu beeinflussen, aber ich habe mindestens eine Situation, in der es ein Problem sein kann. Vermisse ich etwas Offensichtliches? Hat jemand anderes dieses Verhalten bemerkt oder hatte er Probleme damit?

Falls relevant, verwende ich ein iPhone 3GS mit iOS 5.1.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage