3 votes

iPhone - ignorer la deuxième touche sur une zone

J'ai une vue sur le fait que les utilisateurs sont autorisés à peindre avec les doigts. Le code fonctionne parfaitement si la zone est touchée avec un seul doigt. Par exemple : Je la touche avec un doigt et je déplace le doigt. Ensuite, une ligne est dessinée lorsque je déplace le premier doigt. Si je touche avec un deuxième doigt la même vue, la ligne qui était dessinée par le premier doigt s'arrête.

Je voudrais ignorer toute touche au-delà de la première, c'est-à-dire suivre la première touche mais ignorer toutes les autres sur la même vue.

J'utilise les touchesBegan/moved/ended.

Je l'ai utilisé pour détecter les touches

UITouch *touch = [[event allTouches] anyObject];
lastPoint = [touch locationInView:myView];

J'ai aussi essayé ceci

lastPoint = [[touches anyObject] locationInView:myView];

mais rien n'a changé.

Comment puis-je faire cela - suivre la première touche et ignorer toute touche ultérieure d'une vue ?

Merci.

REMARQUE : la vue n'est PAS ajustée pour détecter les touchers multiples.

3voto

ughoavgfhw Points 28400

Une touche donnée conservera la même adresse mémoire tant qu'elle sera en contact avec l'écran. Cela signifie que vous pouvez enregistrer l'adresse comme une variable d'instance et ignorer tout événement provenant d'autres objets. Toutefois, ne conservez pas la touche. Si vous le faites, une adresse différente sera utilisée et votre code ne fonctionnera pas.

Exemple :

Ajouter currentTouch à votre interface :

@interface MyView : UIView {
    UITouch *currentTouch;
    ...
}
...
@end

Modifier touchesBegan: pour ignorer la touche si une autre est déjà en cours de suivi :

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if(currentTouch) return;
    currentTouch = [touches anyObject];
    ...
}

Modifier touchesMoved: à utiliser currentTouch au lieu de recevoir une touche du plateau :

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    if(!currentTouch) return;
    CGPoint currentPoint = [currentTouch locationInView:myView];
    ...
}

Modifier touchesEnded: et touchesCancelled: pour dégager currentTouch mais seulement si currentTouch a pris fin ou a été annulée.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if(currentTouch && currentTouch.phase == UITouchPhaseEnded) {
        ...
        currentTouch = nil;
    }
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    if(currentTouch && currentTouch.phase == UITouchPhaseCancelled) {
        ...
        currentTouch = nil;
    }
}

0voto

7KV7 Points 19750
yourView.multipleTouchEnabled = NO;

De la documents de référence sur UIView

multipleTouchEnabled

Une valeur booléenne qui indique si le récepteur gère les événements multitouch.

@property(nonatomic, getter=isMultipleTouchEnabled) BOOL multipleTouchEnabled Discussion

Lorsqu'il est réglé sur OUI, le récepteur reçoit tous les touchers associés à une séquence séquence multitouch. Lorsqu'il est réglé sur NO, le récepteur ne reçoit que le premier événement de contact dans une séquence multitouch. La valeur par défaut de cette propriété est NO.

D'autres vues dans la même fenêtre peuvent toujours recevoir des événements tactiles lorsque ce propriété est NON. Si vous voulez que cette vue gère exclusivement les événements multitouch exclusivement, définissez les valeurs des deux propriétés cette propriété et de la propriété exclusiveTouch à YES.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X