2009-07-08 5 views
3

Comment dois-je gérer, ou plutôt ne pas manipuler (ignorer), les touches de mon arrière-plan? Il se trouve être la vue de mon contrôleur de vue qui a des sous-vues (objets) que je veux répondre aux événements tactiles. Définir userInteractionEnabled = NO pour la vue semble désactiver toutes les interactions pour les sous-vues.Ignorer les touchers en arrière-plan (super) view

Je teste actuellement

if ([[touch view] superview] == self.view) 

dans touchesBegan/DEPLACE/terminé. Mais j'essaie d'éliminer certains tests conditionnels afin de trouver un meilleur moyen ...

Répondre

2

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; appelle récursivement -pointInside:withEvent:. Si vous remplacez cela dans votre vue d'arrière-plan, vous pouvez spécifier quelle sous-vue est atteinte - vous pouvez être fainéant et demander à chacune de vos sous-vues si elles y retourneront oui, et ne jamais revenir vous-même (retour nul si tous retournent à zéro). Quelque chose comme:

UIView *hitView = nil; 
NSArray *subviews = [self subviews]; 
int subviewIndex, subviewCount = [subviews count]; 
for (int subviewIndex = 0; !hitView && subviewIndex < subviewCount; subviewIndex++) { 
    hitView = [[subviews objectAtIndex:subviewIndex] hitTest:point withEvent:event]; 
} 
return hitView; 
2

Merci pour la réponse Dan, grande question aussi.

Cependant, la réponse acceptée comporte une erreur: les sous-vues hitTesting doivent être effectuées avec le point converti dans la sous-vue. De même, subviewIndex est déjà défini avant 'for'. Comme les sous-vues sont triées en fonction de leur index z, l'itération devrait aller du dernier au premier (voir Event handling for iOS - how hitTest:withEvent: and pointInside:withEvent: are related? et How to get UIView hierarchy index ??? (i.e. the depth in between the other subviews)).

Voici le code mis à jour:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    UIView *hitView = nil; 
    NSArray *subviews = [self subviews]; 
    int subviewIndex, subviewCount = [subviews count]; 
    for (subviewIndex = subviewCount-1; !hitView && subviewIndex >= 0; subviewIndex--) { 
     UIView *subview = [subviews objectAtIndex:subviewIndex]; 
     hitView = [subview hitTest:[self convertPoint:point toView:subview] withEvent:event]; 
    } 
    return hitView; 
}