42 votes

Comment désactiver le multitouch ?

Mon application comporte plusieurs boutons qui déclenchent différents événements. L'utilisateur ne devrait PAS être en mesure de maintenir plusieurs boutons enfoncés. Quoi qu'il en soit, le fait de maintenir plusieurs boutons enfoncés fait planter l'application.

Et donc, j'essaie de désactiver le multi-touch dans mon application.

J'ai décoché l'option "Multiple Touch" dans tous les fichiers xib, et d'après ce que j'ai compris, les propriétés "multipleTouchEnabled" et "exclusiveTouch" contrôlent si la vue utilise le multitouch. Donc dans mon applicationDidFinishLaunching j'ai mis ceci :

self.mainViewController.view.multipleTouchEnabled = NO;
self.mainViewController.view.exclusiveTouch = YES;

Et dans chacun de mes contrôleurs de vue, j'ai mis ceci dans le viewDidLoad

self.view.multipleTouchEnabled = NO;
self.view.exclusiveTouch = YES;

Cependant, il todavía accepte les touchers multiples. Je pourrais faire quelque chose comme désactiver d'autres boutons après avoir reçu un événement de toucher, mais ce serait un hack moche. Il existe sûrement un moyen de désactiver correctement le multi-touch ?

0 votes

J'ai également essayé de faire la même chose mais je n'y suis toujours pas parvenu. Quelqu'un sait-il comment désactiver la sélection tactile multiple dans Cocos2D ?

1 votes

Vous devez définir exclusiveTouch = YES sur chaque bouton, et non sur la vue.

0 votes

Le problème principal est que votre VIEW est mono-touch, mais pas les subviews Vous devez donc désactiver les boutons, ou mettre une grande vue sur les boutons et gérer le toucher unique sur celle-ci.

49voto

Mark Bessey Points 13931

Si vous voulez qu'un seul bouton réponde aux touchers à la fois, vous devez définir exclusiveTouch pour ce bouton, plutôt que pour la vue parent. Vous pouvez également désactiver les autres boutons lorsqu'un bouton reçoit l'événement "Touch Down".


Voici un exemple de cette dernière, qui a mieux fonctionné dans mes tests. Le paramétrage de la fonction exclusiveTouch pour les boutons a fonctionné, mais a entraîné des problèmes intéressants lorsque vous avez déplacé votre doigt sur le bord d'un bouton, plutôt que de simplement cliquer dessus.

Vous devez avoir des prises dans votre contrôleur reliées à chaque bouton, et avoir les événements "Touch Down", "Touch Up Inside" et "Touch Up Outside" reliés aux méthodes appropriées dans votre contrôleur.

#import "multibuttonsViewController.h"

@implementation multibuttonsViewController

// hook this up to "Touch Down" for each button
- (IBAction) pressed: (id) sender
{
    if (sender == one)
    {
        two.enabled = false;
        three.enabled = false;
        [label setText: @"One"]; // or whatever you want to do
    }
    else if (sender == two)
    {
        one.enabled = false;
        three.enabled = false;
        [label setText: @"Two"];  // or whatever you want to do
    }
    else
    {
        one.enabled = false;
        two.enabled = false;
        [label setText: @"Three"];  // or whatever you want to do
    }
}

// hook this up to "Touch Up Inside" and "Touch Up Outside"
- (IBAction) released: (id) sender
{
    one.enabled = true;
    two.enabled = true;
    three.enabled = true;
}

@end

3 votes

Cela signifie-t-il qu'il faut mettre button1.exclusiveTouch = YES;button2.exclusiveTouch = YES;button3.exclusiveTouch = YES ; dans le viewDidLoad du contrôleur de vue ? J'ai essayé cela - sans effet.

4 votes

Je viens de l'essayer, et ça a marché pour moi. Est-il possible que les sorties de votre viewController ne soient pas définies correctement ? Cela peut valoir la peine de vérifier dans le débogueur.

0 votes

Toutes mes excuses. Les boutons n'étaient pas connectés correctement dans IB.

21voto

neoevoke Points 499
- (void)viewDidLoad {
    [super viewDidLoad];

    for(UIView* v in self.view.subviews)
    {
        if([v isKindOfClass:[UIButton class]])
        {
            UIButton* btn = (UIButton*)v;
            [btn setExclusiveTouch:YES];
        }
    }
}

0 votes

Extension UIButton { open override func touchesBegan(_ touches : Set<UITouch>, with event : UIEvent ?) { super.touchesBegan(touches, with : event) self.isEnabled=false DispatchQueue.main.asyncAfter(deadline : .now() + 1) { self.isEnabled = true } } }

6voto

Parth Mehta Points 33
- (void)viewDidLoad {
    [super viewDidLoad];

    for(UIView* v in self.view.subviews)
    {
        if([v isKindOfClass:[UIButton class]])
        {
            UIButton* btn = (UIButton*)v;
            [btn setExclusiveTouch:YES];
        }
    }
}

Ce code a été testé et fonctionne parfaitement pour moi. Il n'y a pas de plantage de l'application lorsque l'on appuie sur plus d'un bouton à la fois.

5voto

Nikolai Ruhe Points 45433

Votre application se plante pour une raison. Cherchez plus loin, utilisez le débogueur, voyez ce qui ne va pas au lieu d'essayer de cacher le bug.

Editar:

Ok, ok, je dois admettre que j'ai été un peu dur. Vous devez définir la propriété exclusiveTouch sur chaque bouton . C'est tout. La propriété multipleTouchEnabled n'est pas pertinente.

0 votes

Je n'essaie pas de cacher le bug. l'utilisateur ne devrait pas pouvoir appuyer sur plusieurs boutons.

0 votes

Dur, oui. Mais aussi correct. exclusiveTouch doit être défini sur chaque bouton, et dans ce cas, avec un bug qui sera probablement difficile à localiser sans informations détaillées... le débogueur sera votre meilleur ami sur ce point.

0 votes

Le réglage de la touche exclusive sur chaque bouton n'a aucun effet.

3voto

h4lc0n Points 1032

En me basant sur la réponse de neoevoke, mais en l'améliorant un peu pour qu'elle vérifie également les enfants des sous-vues, j'ai créé cette fonction et l'ai ajoutée à mon fichier utils :

// Set exclusive touch to all children

+ (void)setExclusiveTouchToChildrenOf:(NSArray *)subviews
{
    for (UIView *v in subviews) {
        [self setExclusiveTouchToChildrenOf:v.subviews];
        if ([v isKindOfClass:[UIButton class]]) {
            UIButton *btn = (UIButton *)v;
            [btn setExclusiveTouch:YES];
        }
    }
}

Ensuite, un simple appel à :

[Utils setExclusiveTouchToChildrenOf:self.view.subviews];

... fera l'affaire.

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