2016-12-12 4 views
1

Je sais que les événements tactiles peuvent être envoyés en mode hit-view ou gesture. mais quelque chose m'a brouillé dans ma démo:Comment fonctionne UIGestureRecognizer avec la chaîne UIResponder?

J'ai deux sous-vues dans ma vue racine, l'une est testView (sous-classe de UIView), l'autre est testBtn (UIButton) dont l'action est "testBtnClicked". Ensuite, j'ajoute un UITapGestureRecognizer à ma vue racine et définissez son action sur "tapAction".

Le problème vient:

quand je touche sur la vue racine, il déclenche "touchsBegan: withEvent:": méthode, "tapAction" et "withEvent touchsCancelled". C'est ce à quoi je m'attendais.

Lorsque j'appuie sur testView, cela fonctionne comme ci-dessus; Lorsque j'ai touché testBtn, cela n'a déclenché que la méthode "testBtnClicked". Pourquoi?

Pourquoi le geste est-il reconnu lorsque j'appuie sur testView pas sur la vue racine? et pourquoi ce n'est pas reconnu quand je touche à testBtn?

Répondre

4

Aha! Peut-être que je suis la réponse:

Tout d'abord, gestureRecognizers obtenir la première occasion de reconnaître une touche, comme le dit App Doc:

Une fenêtre retarde la livraison des objets tactiles à la vue afin que le geste Le système de reconnaissance peut d'abord analyser le toucher. Pendant le délai, si le détecteur de mouvement reconnaît un geste tactile, la fenêtre ne livre jamais l'objet tactile à la vue et annule également les objets tactiles précédemment envoyés à la vue faisant partie de cette séquence reconnue.

En second lieu, iOS 6.0 et versions ultérieures, les actions UIButton empêchent le comportement geste de reconnaissance se chevauchent, aussi comme Apple dit Doc:

Dans iOS 6.0 et versions ultérieures, les actions de contrôle par défaut anticumul le comportement de reconnaissance de geste. Par exemple, l'action par défaut pour un bouton est un simple appui. Si vous avez un seul reconnaisseur de gestes de robinet attaché à la vue parente d'un bouton, et que l'utilisateur appuie sur le bouton, la méthode d'action du bouton reçoit l'événement tactile au lieu du dispositif de reconnaissance de gestes. Ceci ne concerne que la reconnaissance des gestes qui chevauche l'action par défaut pour un contrôle, qui comprend:

  • Un seul doigt simple pression sur un UIButton, UISwitch, UIStepper, UISegmentedControl et UIPageControl.
  • Balayage d'un seul doigt sur le bouton d'un UISlider, dans une direction parallèle au curseur.
  • Un geste de doigt unique sur le bouton d'un commutateur UIS, dans une direction parallèle à l'interrupteur.

Si vous avez une sous-classe personnalisée d'un de ces contrôles et que vous souhaitez modifier l'action par défaut, joindre un geste de reconnaissance directement au contrôle au lieu de la vue parent. Ensuite, le système de reconnaissance de gestes reçoit d'abord l'événement tactile. Comme toujours, assurez-vous de lire les consignes d'interface utilisateur iOS pour vous assurer que votre application offre une expérience utilisateur intuitive, en particulier lorsque vous remplacez le comportement par défaut d'un contrôle standard.