Comment autoriser les UIViews frères à gérer différents gestes?


1

J'ai un UIView qui a deux sous-vues, l'un est un UIScrollView et l'autre est une vue de conteneur pour quelques autres sous-vues. La vue de conteneur couvre complètement la vue de défilement.

Vues qui ont besoin de gérer les gestes:

  • UIScrollView - doit gérer le pincement par défaut et les panoramiques
  • vue Container - aucune
  • vue conteneur subviews - doit gérer robinet geste

Maintenant, pour que les gestes du robinet soient gérés par les sous-vues de la vue conteneur, j'ai implémenté le pointInside: withEvent: pour la vue conteneur. S'il reconnaît que le point est dans l'une de ses sous-vues, il renvoie YES. Cela fonctionne bien. Le problème est que lorsque je pince ou que je fais un panoramique et que mon doigt touche initialement l'un des sous-affichages de la vue conteneur, cela ne fonctionne pas. Lorsque je pince ou que je fais un panoramique sur une zone vide de la vue du conteneur, cela fonctionne comme il se doit.

Des suggestions pour le fonctionnement?

EDIT:

J'ai mis en hitTest: withEvent: pour la vue principale et a obtenu le même comportement.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView *hitTestView; 

    for (UIView *subview in [self.subviews reverseObjectEnumerator]) 
    { 
     hitTestView = [subview hitTest:[self convertPoint:point 
                toView:subview] 
          withEvent:event]; 

     if (hitTestView && ![hitTestView isKindOfClass:[ContainerView class]]) 
     { 
      break; 
     } 
    } 

    return hitTestView; 
} 

Sur la ligne de fond la question est ici comment une vue ne gère que quelques gestes et passe sur d'autres gestes si une vue sous-jacente pourrait les manipuler.
J'ai beaucoup lu sur le sujet et essayé différentes approches, mais je n'ai pas trouvé de solution simple à ce qui me semble être un problème assez commun.

2

Vous n'avez pas besoin de gérer manuellement les mouvements de pincement et de panoramique sur UIScrollView, cela se fera automatiquement.

Pour gérer les sous-visualisations de vue conteneur, vous pouvez utiliser UITapGestureRecognizer. Pour chaque vue, vous devez gérer l'utilisation du robinet:

UITapGestureRecognizer* tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFirstSubview:)]; 
[firstSubview addGestureRecognizer:tapRecognizer]; 

méthode Handler:

- (void)handleTapFirstSubview:(UITapGestureRecognizer *)tapRecogmizer 
{ 
    // handle tap here 
} 
+2

J'ai un robinet geste de reconnaissance pour chaque sous-vue et le contrôleur de vue qui maintient la vue principale est de les manipuler. Le problème n'est pas que je veux gérer le pincement et le pan de UIScrollView moi-même, mais que la vue de conteneur bloque UIScrollView d'obtenir ces gestes. Existe-t-il un moyen de transmettre ces gestes à UIScrollView sous-jacent? 07 mars. 142014-03-07 20:48:40