Pourquoi UIViewController touchesBegan, touchesMoved & touchesEnded seulement être appelé lorsque la première des deux touches commence, déplace ou se termine?

Je vais avoir un problème avec la gestion de plus d'un contact par le biais de la touchesBegan/Déplacé/Clos des méthodes de UIViewController. Je vois également que le même comportement dans un cocos2d application (à l'aide de ccTouchesBegan/Déplacé/Terminé) donc je pense que cette question peut être appliquée à tous touch de manutention dans iOS. J'ai mis le code que j'utilise ci-dessous, suivis par les résultats que je vois.

Tous les moyens sont mis en œuvre sur une sous-classe 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++;
    }
}

Maintenant, pour les résultats les plus intéressants...

Seule Touche fonctionne comme Prévu

Disons que je touche l'écran avec mon pouce. Je vois dans la fenêtre de sortie qui touchesBegan a été appelé comme prévu. - Je déplacer mon pouce autour de et touchesMoved est appelée. Alors je lève mon pouce de l'écran et touchesEnded est appelée. Tout cela est normal, je suis, y compris dans la question comme un cas de commande - juste pour être clair, que mon point de vue, contrôleur reçoit les événements tactiles, et je n'en ai pas manqué un vc.view.userInteractionEnabled = YES n'importe où.

La Deuxième Touche Ne provoque pas de touchesBegan, touchesMoved ou touchesEnded d'être appelé

C'est le plus intéressant. Disons que je touche l'écran avec mon pouce (touchesBegan est appelé) et maintenez-il encore sur l'écran. Puis je touche quelque part d'autre sur l'écran de mon index, tout en gardant mon pouce dans le même lieu. TouchesBegan n'est pas appelé. Alors disons que je déplacer mon index tout en gardant mon pouce immobiles (ce qui peut être délicat, mais c'est possible). TouchesMoved n'est pas appelé. Alors, je lève mon doigt d'index hors de l'écran. TouchesEnded n'est pas appelé. Enfin, je passe mon pouce et touchesMoved est appelé. Alors je lève mon pouce à partir de l'écran et touchesEnded est appelé.

Juste pour être clair: j'ai mis self.view.multipleTouchEnabled = YES dans mon viewDidLoad méthode.

Informations Sur le Deuxième Contact est Disponible, le Premier Contact se Déplace

Cette fois, je ne quelque chose de très similaire à l'exemple ci-dessus. Je touche l'écran avec mon pouce, puis l'index tout en gardant mon pouce encore. TouchesBegan est appelée lors de mon pouce frappe l'écran, mais pas de mon index. Maintenant, je déplacer mon pouce, et touchesMoved est appelé. Non seulement cela, mais il y a deux touches dans l'événement.allTouches tableau (et oui, le deuxième contact est là que je m'attends à ce qu'il soit). Cela signifie que le système est au courant que j'ai touché l'écran une deuxième fois, mais je ne suis pas d'en être informés par le biais de la touche de méthodes de manipulation sur mon point de vue contrôleur.

Comment puis-je être Informé Sur les Modifications apportées à la Deuxième Touche?

Je voudrais vraiment être en mesure de répondre aux changements dans l'emplacement ou de l'état de la deuxième touche comme ils se produisent, plutôt que lors de la première touche également des changements. Beaucoup de temps, ce ne sera pas un problème car il est très difficile de changer une seule touche, sans impact sur les autres, mais j'ai au moins une situation où il peut être un problème. Ai-je raté quelque chose d'évident? Quelqu'un d'autre a remarqué ce comportement ou eu des problèmes avec elle?

Dans le cas où c'est pertinent, je suis sur un iPhone 3GS sous iOS 5.1.

avez-vous des exclusiveTouch = YESquelque part dans votre vue de la hiérarchie? Cela semble se produire pour moi, quand le premier contact est dans un sous-vue de vue avec exclusiveTouch = YES
Je n'ai pas mis n'importe où dans le code, mais j'utilise les storyboards - pourraient-ils avoir mis quelque part? Est-il d'autres biens qui pourraient avoir un effet similaire? Ce point de vue est un contrôleur de quelques générations de profondeur dans la hiérarchie vue donc, l'un de ses superviews peut-être faire quelque chose que je ne suis pas attendre.
je suis peut-être trop tard, mais avez-vous remarqué que dans chaque méthode de la super appelée est la même : touchesEnded

OriginalL'auteur rankAmateur | 2012-08-25