Comment désactiver le multitouch?

Mon application a plusieurs boutons qui déclenchent différents événements. L'utilisateur ne devrait pas pouvoir maintenir plusieurs boutons enfoncés. Quoi qu'il en soit, maintenir enfoncé plusieurs boutons bloque l'application.

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

J'ai décoché 'Multiple Touch' dans tous les fichiers xib, et pour autant que je puisse travailler, les propriétés 'multipleTouchEnabled' et 'exclusiveTouch' contrôlent si la vue utilise multitouch. Donc dans mon applicationDidFinishLaunching j'ai mis ce:

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

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

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

Cependant, il accepte toujours plusieurs touches. Je pourrais faire quelque chose comme désactiver d'autres boutons après avoir obtenu un événement tactile, mais ce serait un hack laid. Certes, il y a un moyen de désactiver correctement multi-touch?

34
demandé sur cannyboy 2009-07-03 20:26:02

18 réponses

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


Voici un exemple de ce dernier, qui a mieux fonctionné dans mes tests. Réglage exclusiveTouch pour les boutons genre de travaillé, mais a conduit à des problèmes intéressants lorsque vous avez déplacé votre doigt sur le bord d'un bouton, plutôt que de simplement cliquer il.

Vous devez avoir des prises dans votre contrôleur connectées à chaque bouton, et avoir les événements" toucher vers le bas"," toucher à l'intérieur "et" toucher à L'extérieur " connecté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
44
répondu Mark Bessey 2009-07-03 18:09:13
- (void)viewDidLoad {
    [super viewDidLoad];

    for(UIView* v in self.view.subviews)
    {
        if([v isKindOfClass:[UIButton class]])
        {
            UIButton* btn = (UIButton*)v;
            [btn setExclusiveTouch:YES];
        }
    }
}
21
répondu neoevoke 2011-06-03 16:47:22
- (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 est testé et fonctionne parfaitement pour moi.il n'y a pas de plantage de l'application lorsque vous appuyez sur plus d'un bouton à la fois.

5
répondu Parth Mehta 2014-09-05 09:25:10

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

Modifier:

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.

3
répondu Nikolai Ruhe 2009-07-03 17:27:17

Basé sur la réponse de neoevoke, ne l'améliorant qu'un peu pour qu'il 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.

3
répondu h4lc0n 2013-12-20 08:59:36

Ce problème est souvent signalé par nos testeurs. L'une des approches que j'utilise parfois, bien qu'elle devrait être utilisée consciemment, est de créer une catégorie pour UIView, comme celle-ci:

@implementation UIView (ExclusiveTouch)

- (BOOL)isExclusiveTouch
{
    return YES;
}
3
répondu Krodak 2014-11-25 10:48:08

Pour désactiver le multitouch dans SWIFT:

Vous devez d'abord avoir une prise de chaque bouton et ensuite régler la touche exclusive sur true.Par conséquent, en Vous {[0] } aurait:

yourButton.exclusiveTouch = true.

/ / Pas vraiment nécessaire mais vous pouvez aussi ajouter:

self.view.multipleTouchEnabled = false

2
répondu Alex Zanfir 2015-11-25 09:37:26

Assez simple, vous pouvez utiliser make use of ExclusiveTouch property dans ce cas

[youBtn setExclusiveTouch:YES];

Il s'agit d'une valeur booléenne qui indique si le récepteur gère exclusivement les événements tactiles.

Si cette propriété est définie sur YES, le récepteur bloque la diffusion d'événements tactiles vers d'autres vues de la même fenêtre. La valeur par défaut de cette propriété est NON.

1
répondu Aks 2016-08-25 18:34:35

Mon expérience est que, par défaut, un nouveau projet n'autorise même pas le multitouch, vous devez l'activer. Mais je suppose que cela dépend de la façon dont vous avez commencé. Avez-vous utilisé un exemple mutlitouch comme modèle?

Tout d'abord, êtes-vous absolument sûr que le multitouch est activé? Il est possible de générer des touches simples en séquence assez rapidement. Multitouch est plus sur ce que vous faites avec deux doigts ou plus une fois qu'ils sont sur la surface. Peut être que vous avez une seule touche mais ne sont pas correctement faire face à ce qui se passe si deux boutons sont pressés à peu près en même temps.

0
répondu Nosredna 2009-07-03 16:47:30

Je viens d'avoir exactement ce problème.

La solution que nous avons trouvée était simplement d'hériter d'une nouvelle classe de UIButton qui remplace la méthode initWithCoder, et de l'utiliser là où nous avions besoin d'un bouton à la fois (ie. partout):

@implementation ExclusiveButton

(id)initWithCoder: (NSCoder*)decoder 
{ 
   [self setExclusiveTouch:YES]; 
   return [super initWithCoder:decoder]
}

@end

Notez que cela ne fonctionne qu'avec les boutons chargés à partir des fichiers nib.

0
répondu Andy Krouwel 2010-05-24 12:04:44

J'ai créé L'Extension de classe UIView et ajouté ces deux fonctions. et quand je veux désactiver view touch, j'appelle simplement [view makeExclusiveTouch];

- (void) makeExclusiveTouchForViews:(NSArray*)views {
    for (UIView * view in views) {
        [view makeExclusiveTouch];
    }
}

- (void) makeExclusiveTouch {
    self.multipleTouchEnabled = NO;
    self.exclusiveTouch = YES;
    [self makeExclusiveTouchForViews:self.subviews];
}
0
répondu kjhkjhkjh 2013-06-01 08:33:32

Si vous voulez désactiver le multitouch par programmation, ou si vous utilisez cocos2d (pas d'option multipleTouchEnabled), vous pouvez utiliser le code suivant sur votre délégué ccTouches:

- (BOOL)ccTouchesBegan:(NSSet *)touches
 withEvent:(UIEvent *)event {
       NSSet *multiTouch = [event allTouches];
       if( [multiTouch count] > 1) { 
            return; 
       }
       else {
           //else your rest of the code  
}
0
répondu Jonny Ramos 2013-06-03 20:51:48

Désactiver tous les boutons de l'affichage dans "Touch Down" événement, et de leur permettre de "Touch Up Inside" événement.

Par exemple

- (void) handleTouchDown {
    for (UIButton *btn in views) {
        btn.enable = NO;
    }
}

- (void) handleTouchUpInside {
    for (UIButton *btn in views) {
        btn.enable = Yes;
    }
    ------
    ------
}
0
répondu Rajendra 2014-01-11 11:32:39

J'ai décidé ce problème de cette façon:

NSTimeInterval intervalButtonPressed;

- (IBAction)buttonPicturePressed:(id)sender{ 

    if (([[NSDate date] timeIntervalSince1970] - intervalButtonPressed) > 0.1f) {
        intervalButtonPressed = [[NSDate date] timeIntervalSince1970];
        //your code for button
    }
}
0
répondu Igor 2014-10-09 11:00:07

J'avais eu du mal avec quelques cas étranges lors du déplacement d'objets autour d'une vue, où si vous touchiez un autre objet en même temps, il déclencherait la méthode touchesBegan. Ma solution consistait à désactiver l'interaction de l'utilisateur pour la vue parent jusqu'à ce que touchesEnded ou touchesCancelled soit appelé.

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
   // whatever setup you need
   self.view.userInteractionEnabled = false 
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
   // whatever setup you need
   self.view.userInteractionEnabled = true
}

override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
   // whatever setup you need
   self.view.userInteractionEnabled = true
}
0
répondu Gaston Martin 2016-01-27 17:07:31

Si vous voulez désactiver le multi touch dans toute l'application et ne voulez pas écrire de code pour chaque bouton, vous pouvez simplement utiliser {[3] } du bouton. Écrivez ci-dessous la ligne dans didFinishLaunchingWithOptions.

UIButton.appearance().isExclusiveTouch = true

C'est génial!! UIAppearance

, Vous pouvez même l'utiliser pour tout de UIView classe donc, si vous voulez désactiver le multi-touch pour quelques boutons. Créez une classe personnalisée de bouton, puis

CustomButton.appearance().isExclusiveTouch = true

Il y a un avantage supplémentaire qui peut vous aider. Dans le cas où vous souhaitez désactiver multi touch de boutons dans un ViewController

UIButton.appearance(whenContainedInInstancesOf: [ViewController2.self]).isExclusiveTouch = true
0
répondu TheTiger 2018-03-15 12:40:38

Pour désactiver le multitouch global dans Xamarin.iOS

Copiez et collez le code ci-dessous:

[DllImport(ObjCRuntime.Constants.ObjectiveCLibrary, EntryPoint = "objc_msgSend")]
internal extern static IntPtr IntPtr_objc_msgSend(IntPtr receiver, IntPtr selector, bool isExclusiveTouch);
static void SetExclusiveTouch(bool isExclusiveTouch)
{
    var selector = new ObjCRuntime.Selector("setExclusiveTouch:");
    IntPtr_objc_msgSend(UIView.Appearance.Handle, selector.Handle, isExclusiveTouch);
}

Et définissez-le sur AppDelegate:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    ...
    SetExclusiveTouch(true); // setting exlusive to true disables the multitouch
    ...
}
0
répondu mr5 2018-09-13 05:14:36

Il suffit de définir toutes les propriétés UIView pertinentes exclusiveTouch à false pour faire l'affaire.

-1
répondu tounaobun 2014-12-28 16:54:37