2012-03-14 2 views
0

J'ai une vue avec deux reconnaisseurs de mouvement par balayage. Un gauche et un droit.Limiter l'événement tactile à afficher

En plus de cette vue, j'ai une autre vue avec deux autres reconnaisseurs de mouvement par balayage.

Mon problème est que tout balayage que je fais sur la deuxième vue est également envoyé à la vue parent.

Comment puis-je empêcher cela? Et, comment puis-je empêcher un événement tactile déclenché dans la vue enfant B d'être envoyé à la vue parente A?

merci!

ps. désolé si cette question a été posée auparavant .. j'ai essayé un tas de choses avant de demander, mais rien n'a fonctionné ..

Répondre

0

Ceci peut être facilement accompli avec la propriété cancelsTouchesInViewUIGestureRecognizer. Définissez ceci sur YES sur les reconnaisseurs de la sous-vue, ce qui devrait empêcher les gestes de se propager à la vue parente.

+0

Je veux juste pouvoir appuyer sur les boutons et faire défiler sans déclencher les parents de reconnaissance des vues. –

+0

Intéressant. Je pense que vous devriez être en mesure de remplacer la méthode 'touchesBegan' dans la vue enfant pour gérer cela, mais après quelques minutes de jouer avec cela, je n'ai pas trouvé de solution de travail. Cette réponse est probablement ce que vous avez besoin http://stackoverflow.com/a/5234804/144755 – oltman

+0

Merci oltman. –

0

Je viens de terminer un work-around qui peut aider les autres qui rencontrent ce sujet.

La prémisse de base est d'attraper quand un contact se produit et d'enlever des gestes si le contact s'est produit dans un ensemble de vues. Il rajoute ensuite les gestes après que le système de reconnaissance de gestes a géré les gestes. Que dois-je faire si je n'ai pas de reconnaissance de mouvement ou de reconnaissance tactile sur la vue enfant?

@interface TouchIgnorer : UIView 
@property (nonatomic) NSMutableSet * ignoreOnViews; 
@property (nonatomic) NSMutableSet * gesturesToIgnore; 
@end 
@implementation TouchIgnorer 
- (id) init 
{ 
    self = [super init]; 
    if (self) 
    { 
     _ignoreOnViews = [[NSMutableSet alloc] init]; 
     _gesturesToIgnore = [[NSMutableSet alloc] init]; 
    } 
    return self; 
} 
- (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    CGPoint relativePt; 
    for (UIView * view in _ignoreOnViews) 
    { 
     relativePt = [view convertPoint:point toView:view]; 
     if (!view.isHidden && CGRectContainsPoint(view.frame, relativePt)) 
     { 
      for (UIGestureRecognizer * gesture in _gesturesToIgnore) 
      { 
       [self removeGestureRecognizer:gesture]; 
      } 
      [self performSelector:@selector(rebindGestures) withObject:self afterDelay:0]; 
      break; 
     } 
    } 
    return [super pointInside:point withEvent:event]; 
} 

- (void) rebindGestures 
{ 
    for (UIGestureRecognizer * gesture in _gesturesToIgnore) 
    { 
     [self addGestureRecognizer:gesture]; 
    } 
} 
@end 
Questions connexes