Exclure des sous-vues de UIGestureRecognizer
J'ai une UIView ("container view') qui contient plusieurs sous-vues". Je veux ajouter un UITapGestureRecognizer pour le conteneur de vue, tel qu'il est activé quand je touche la région à l'intérieur du conteneur point de vue, mais à l'extérieur de la sous-vues.
À l'heure actuelle, de toucher n'importe où à l'intérieur du conteneur, y compris à l'intérieur de la sous-vues active le geste de reconnaissance.
La mise en œuvre ressemble à quelque chose comme ceci:
Dans le contrôleur:
ContainerView *containerView = [[ContainerView alloc] initWithSubViews:array];
UITapGestureRecognizer *tap = [UITapGestureRecognizer alloc] initWithTarget:self action:@selector(someSelector)];
[containerView addGestureRecognizer:tap];
[self.view addSubView:containerView];
Dans ContainerView.m
-(id)initWithSubviews:(NSArray *)array {
for (subView *s in array) {
[self addSubView:s];
}
return self;
}
Je pense que le problème se produit parce que le geste de reconnaissance est ajouté, après le sous-vues sont. Si c'est vrai, alors la solution nécessiterait la rupture de la initWithSubViews méthode en deux distinctes, que je préférerais éviter.
Merci
Vous devez vous connecter pour publier un commentaire.
iOS 6 introduit une nouvelle fonctionnalité qui permet de résoudre ce problème exact - une UIView (sous-vue) peut retourner PAS de
gestureRecognizerShouldBegin:
(geste de reconnaissance attaché à un superview). En effet, c'est la valeur par défaut pour certaines UIView sous-classes à l'égard de certains modules de reconnaissance de geste (par exemple un UIButton à l'égard d'un UITapGestureRecognizer attaché à un superview).Voir mon livre sur ce sujet: http://www.apeth.com/iOSBook/ch18.html#_gesture_recognizers
J'ai utilisé de la manière la plus simple ci-dessous. Il fonctionne perpectly!
Mettre en œuvre UIGestureRecognizerDelegate fonction, d'accepter seulement les touchs sur superview, de ne pas accepter touchs sur les sous-vues:
J'ai réussi à le faire fonctionner de la manière suivante:
N'oubliez pas d'ajouter et de définir la méthode du délégué -
Dans votre UIViewController de l' .h fichier inclure ce délégué
Ensuite où vous êtes en train de créer votre tapGesture objet (au sein de viewDidLoad par exemple)
Se souvenir de définir la méthode du délégué
tap.delegate = self;
alors la méthode du délégué du robinet va maintenant se déclencher sur le robinet.Dans cette méthode, vous gérer lorsque vous souhaitez le robinet geste de reconnaissance pour être utilisé, dans mon code je l'ai voulu ignorer un robinet, si une sous-vue était visible
J'espère que cela aide quelqu'un d'autre avec le même problème. Se souvenir de définir le délégué de la méthode que j'ai trouvé était quelque chose qui est facilement négligé.
Acclamations
Beaucoup de réponses, en ajoutant une solution de rechange. Initialiser le point de vue de la balise de la sous-vues vous ne voulez pas recevoir des touches 1 et effectuez les opérations suivantes:
De cette façon, le mouvement tactile sera reçu que des points de vue vous avez besoin de.
Mise à jour de Réponse pour Swift 4
Avant que assurez-vous d'avoir réglage délégué de la propriété à votre objet ..
Si vous avez ajouté
UITapGestureRecognizer
pour ContainerView, elle doit répondre à tous les coins ContainerView. Il ne sera pas tenu de son sous-vues.Vérifier le Geste de l'emplacement, si son dans votre sous-vue position,sautez simplement la geste des actions.
AJOUTÉ:
je viens de penser à quelque chose de mieux.
dans votre gestionnaire de
vérifier si le geste.la vue est le superview.
il sera de retour à la sous-vues si les sous-vues sont exploitées.
====================================================
Je dirais primordial au sein de la superview.
cela est appelé à déterminer si un geste relève de vue
voir la réponse à cette question afin de voir comment il se comporte par défaut.
La gestion des événements pour iOS - comment hitTest:withEvent: et pointInside:withEvent: sont-ils liés?
vous pouvez vérifier si le point est dans l'un de ses sous-vues. si oui, de retour nul, else return self.
OU
dans chacun des sous-vues, ajouter un tapgesture de reconnaissance qui ne fait rien. le geste de reconnaissance d'une sous-vue d'annuler la geste de reconnaissance de ses superview par défaut. je voudrais garder un œil sur l'empreinte mémoire si il y a beaucoup de sous-vues si.