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.). P>
Alors, pourquoi Apple définirait la propriété exclusivetouch code> de
uibutton code> à non par défaut? p>
4 Réponses :
Le 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 Si vous définissez cette propriété sur uiview code> Propriété
exclusivetouch code> La vue (bouton) est la seule chose dans cette fenêtre pouvant être interagiée avec si elle est définie sur
oui code>. 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. P>
exclusivetouch code> défini sur
non code>. P>.
OUI code> 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 code>. Cela signifie que si vous initialisez un bouton avec
exclusivetouch = oui code>, 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. p>
Supposons que j'ai 2 boutons comme sous-visions de la même vue. Si je ne définissais pas exclusivetouch code> 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 i> 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 i> (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 i>". 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)
Exclusivetouch signifie simplement que toute vue sous votre UIButton ne recevra pas les événements tactiles. P>
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. P>
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 i> 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 i>. Si la vue exclusiveTouch n'est pas touchée, d'autres vues (et les vues sous le bouton) sont ouvertes pour les interactions.
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. P>
J'ai vérifié les documents, où dit-il exclusivetouch code> est défini sur
oui code> par défaut?
C'est faux. À partir des documents IOS 5.1: "La valeur par défaut de cette propriété est non."
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 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
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)