8
votes

Pourquoi l'exclusivetouch d'Uibutton n'est-il pas défini par oui par défaut?

Je suis sûr qu'il y a beaucoup de raisons pour lesquelles quelqu'un aimerait avoir plus d'un bouton accepter des touches en même temps. Cependant, la plupart d'entre nous n'ont besoin que d'un bouton pour être pressé à la fois (pour la navigation, pour que quelque chose soit présenté model, de présenter une colleure, une vue, etc.).

Alors, pourquoi Apple définirait la propriété exclusivetouch de uibutton à non par défaut?


0 commentaires

4 Réponses :


-1
votes

Le uiview Propriété exclusivetouch La vue (bouton) est la seule chose dans cette fenêtre pouvant être interagiée avec si elle est définie sur oui . Comme indiqué dans les documents: définir cette propriété sur Oui, le récepteur bloque la livraison des événements tactiles à d'autres vues de la même fenêtre. La valeur par défaut de cette propriété est non.

Par conséquent, il s'agit du comportement commun que vous pourriez avoir plusieurs boutons ou contrôles d'interaction / vues dans une fenêtre et que vous souhaitez exclusivetouch défini sur non . .

Si vous définissez cette propriété sur OUI pour toute sous-classe UIView dans une fenêtre, vous ne pouvez pas interagir avec quoi que ce soit d'autre dans la fenêtre aussi longtemps que cette propriété est définie sur oui . Cela signifie que si vous initialisez un bouton avec exclusivetouch = oui , mais aussi une vue de table ou une autre vue ou une vue de défilement ou une autre vue basée sur l'interaction, elle ne répondra à aucune touche.


3 commentaires

Supposons que j'ai 2 boutons comme sous-visions de la même vue. Si je ne définissais pas exclusivetouch sur NON sur les deux boutons, puis plus tard si l'utilisateur les appuie à la fois en même temps, les deux appellent leurs méthodes d'action. Et si leurs méthodes d'action sont en conflit pour une raison quelconque (disent que les deux appuient un contrôleur d'affichage différent de la pile de navigation), l'application se bloque, d'où ma question.


Jesse: Votre explication est en ligne avec la documentation. Ce n'est donc pas de votre faute, mais comme la documentation originale est trompeuse imo, vous donnez toujours de fausses informations: Exlusivetouch ne prépare pas toucher les événements à d'autres boutons Dans la vue (comme votre explication et les documents semblent impliquer), cela empêche simplement une autre vue de recevoir des événements tandis que celui avec Exclusivetouch gère certains (ainsi que pour empêcher la vue exlusivetouch de recevoir des événements Si d'autres vues traitent aussi bien ...)


Également incorrect - la documentation est trompeuse. Corrigé: "Perce que le récepteur bloque la livraison des événements tactiles s'il reçoit actuellement des événements tactiles eux-mêmes ". Pour effectuer un test de test et prouver que cette réponse est erronée, configurez une XIB avec deux boutons, deux ibactions qui enregistrent deux messages différents, SetexClusivetouch: Oui sur les deux dans la vue ViewDidLoad. Utilisez le "ALT + Cliquez sur" pour effectuer MULTITOUCH sur le simulateur et appuyez sur les deux boutons (utilisez la touche Maj enfoncée pour approcher le contrôle multi-touch). Vous pouvez interagir individuellement sur chaque bouton mais pas avec MULTITOUCH (mais vous pouvez si vous seriez SetExclusivetouch: Non)



-1
votes

Exclusivetouch signifie simplement que toute vue sous votre UIButton ne recevra pas les événements tactiles.

Il est défini sur Non par défaut, car vous voulez généralement la vue sous la suite de recevoir ces événements. Par exemple, si vous avez un uibutton au-dessus d'une vue de défilement et que l'utilisateur souhaite faire défiler. Vous voulez que la vision de ScrollView pour faire défiler même si elles commencent avec leur doigt sur l'Uibutton.


3 commentaires

Je ne pense pas que cela soit précis, @jesse a eu raison. Réglage de cette propriété sur Oui, le récepteur bloque la livraison des événements tactiles à d'autres vues de la même fenêtre.


Cela ne fonctionne pas de cette façon (bien que la documentation le dit): l'effet du drapeau uniquement est de garantir que d'autres vues ne recevront pas d'événement tactile en même temps avec le propriétaire du drapeau (plus ou moins). J'ai réellement testé cela: voir ma réponse pour plus de détails.


Il suffit de refléter les commentaires au-dessus de moi - ce n'est pas la manière dont cette propriété affecte la vue. Il bloquera l'interaction d'autres vues si Il est activement engagé par l'utilisateur . Si la vue exclusiveTouch n'est pas touchée, d'autres vues (et les vues sous le bouton) sont ouvertes pour les interactions.



-1
votes

Je ne faisais que lire des notes de version pour iOS 5 et à partir de cette version, l'exclusivetouch sera défini sur Oui par défaut. Alors gardez à l'esprit que cela changera avec la nouvelle version d'iOS.


2 commentaires

J'ai vérifié les documents, où dit-il exclusivetouch est défini sur oui par défaut?


C'est faux. À partir des documents IOS 5.1: "La valeur par défaut de cette propriété est non."



10
votes

très ancienne question, mais mérite une clarification imo.

malgré la documentation méthode très trompeuse de Apple Strard> A Vue "A" avec EXCLUSIVETOUCH empêchera d'autres points de vue de recevoir des événements si longtemps A titre de traitement de l'événement lui-même fort> (par exemple, définissez un bouton avec Exclusivetouch et mettre un doigt dessus, cela empêchera d'autres vues dans la fenêtre d'être interagi avec, mais l'interaction avec eux suivra le motif habituel une fois le doigt de l'exlusivetouch-item est supprimé). p>

Un autre effet empêche la visualisation A des événements de réception tant que une autre vue est interagi avec (gardez un bouton sans exclusivetouch enfoncé et ceux avec exclusivetouch ne seront pas enfoncés. être capable de recevoir des événements aussi). p>

Vous pouvez toujours définir un bouton à votre vue sur Exclusivetouch et interagir avec les autres, tout en même temps, car ce simple test UIViewController va prouver (une fois le Les liaisons correctes dans l'IB sont définies pour les deux points de vente et Actions): P>

#import "FTSViewController.h"

@interface FTSViewController ()
- (IBAction)button1up:(id)sender;
- (IBAction)button2up:(id)sender;
- (IBAction)button1down:(id)sender;
- (IBAction)button2down:(id)sender;

@property (nonatomic, strong) IBOutlet UIButton *button1, *button2;
@end

@implementation FTSViewController

- (IBAction)button1up:(id)sender {
    NSLog(@"Button1 up");
}

- (IBAction)button2up:(id)sender {
    NSLog(@"Button2 up");
}

- (IBAction)button1down:(id)sender {
    NSLog(@"Button1 down");
}

- (IBAction)button2down:(id)sender {
    NSLog(@"Button2 down");
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Guarantees that button 1 will not receive events *unless* it's the only receiver, as well as
    // preventing other views in the hierarchy from receiving touches *as long as button1 is receiving events*
    // IT DOESN'T PREVENT button2 from being pressed as long as no event is being intercepted by button1!!!
    self.button1.exclusiveTouch = YES;
    // This is the default. Set for clarity only
    self.button2.exclusiveTouch = NO;
}
@end


3 commentaires

Je viens de faire une catégorie UIView qui fait exclusivetouch oui pour tous les uiview et n'a pas eu de problèmes


@jjxtra Comment faire cela, quelle méthode remplace?


Je crois qu'il a créé une sous-classe d'UIView et définit Exclusivetouch à OUI dans la méthode init. Ne travaille pas vraiment pour moi parce que je cherche un moyen facile de faire des touches exclusives pour toutes les vues de mon projet sans copier la même chose dans de nombreux endroits (je suis paresseux: p)