2014-06-24 4 views
4

Dans iOS5, j'utilise UIViewController confinement partout dans une application où j'ai mis en œuvre UITouchGesture dans plusieurs endroits.iOS vue du confinement du contrôleur | Child View Controller passe des touches à Parent View Controller

Lorsque j'ajoute un enfant ViewController (Plein écran), les touches sont transmises à son parent.

Quelle est la solution, le cas échéant? J'utilise MPFlipViewController et je peux voir la page tournant sous l'enfant lorsque l'utilisateur passe son doigt à travers l'enfant ViewController.

Pour plus de précisions, j'ajouter mon ViewController comme un enfant qui suit:

[self addChildViewController:vc]; 
[vc willMoveToParentViewController:nil]; 
[self.container addSubview:vc.view]; 
[vc didMoveToParentViewController:self]; 

Le conteneur est simplement juste un UIView que la vue des childViewController & autres objets UIView asseoir. Merci

Répondre

6

Vous l'avez en arrière. Le confinement des contrôleurs est une chose, mais il ne s'agit que de la hiérarchie de vue standard et de la chaîne de réponse. Ainsi, les touches sont initialement envoyées au parent; spécifiquement, un appel est fait à -(UIView *)hitTest:withEvent: de sa vue. Cela renvoie une vue enfant si une personne peut être trouvée. Sinon, il renvoie l'une de ses propres vues. Peut-être qu'il se retourne.

Si une touche est capturée par le contrôleur parent, cela signifie qu'il n'a jamais été envoyé à l'enfant. Pas que cela soit envoyé à l'enfant puis ascendant jusqu'au parent.

Si vous voulez que le parent fasse quelque chose d'inhabituel avec la capture tactile, il vous suffit d'utiliser une vue personnalisée et d'implémenter votre propre -hitTest:withEvent:. Dans un premier temps, faites cela et connectez-vous aux entrées pour voir ce qui se passe.

+0

Ive a modifié ma question, ce n'est pas standard View Hierachy stuff que j'ajoute le ViewController comme un childViewController qui passe toujours leurs contacts à un objet UIView sur le parent d'où il descend :). – theiOSDude

+1

À moins que vous n'effectuiez manuellement les touches dans cette direction, UIKit ne fonctionne pas comme cela. La recherche pour trouver la vue la plus locale sous une touche descend de la vue la plus haute vers le bas. Donc, de parent à enfant. Non l'inverse. Le confinement du contrôleur ajoute à la gestion normale des vues, il ne change pas les fondamentaux. Comment pensez-vous que la vue sous un contact est trouvée? – Tommy

1

Il est impossible avant la sortie de iOS 7, et je veux savoir si les gourous font cela maintenant.

+0

Alors qu'est-ce que je fais dans iOS7 pour arrêter ça? Thnx – theiOSDude

1

Vous devez implémenter le traitement tactile pour le contrôleur de vue enfant. Autorisez l'enfant à capturer tous les événements tactiles, puis déposez-les afin qu'ils ne soient pas transmis au parent.

Une autre solution pourrait être d'envelopper votre contrôleur de vue enfant dans un UINavigationController, qui pourrait vous obtenir le comportement gratuitement.

Il peut être utile pour vous de publier votre code UITouchGesture à partir du contrôleur de vue parent.

1

En MPFlipViewController.m vous devriez regarder cette méthode:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    // don't recognize simultaneously with scroll view gestures in content area 
    if ([[otherGestureRecognizer view] isKindOfClass:[UIScrollView class]]) 
     return NO; 

    // Allow simultanoues pan & swipe recognizers 
    return YES; 
} 

changer pour quelque chose comme

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    // don't recognize simultaneously with scroll view gestures in content area 
    if ([[otherGestureRecognizer view] isKindOfClass:[UIScrollView class]]) 
     return NO; 

    if (otherGestureRecognizer == GestureRecognizerOfYourChildViewController) 
     return NO; 

    // Allow simultanoues pan & swipe recognizers 
    return YES; 
} 

Où est bien sûr GestureRecognizerOfYourChildViewController le geste de reconnaissance de votre enfant vue contrôleur.

EDIT: Comme OP n'utilise pas de reconnaissance de gestes sur son propre contrôleur de vue enfant, la solution est un peu différente. Je vais laisser la première version ici parce que cela pourrait être utile pour d'autres personnes ayant des problèmes similaires.

meilleure solution que je peux penser ici est que vous devez désactiver gestureRecognizers dans MPFlipViewController quand il y a un contrôleur de vue de l'enfant affiché dessus et leur permettre de nouveau lorsque le contrôleur de vue de l'enfant est enlevé et MPFlipViewController est sur le dessus à nouveau. Utilisez la propriété enabled pour cela.

Les outils de reconnaissance de gestes fonctionnent en dehors de la «chaîne tactile» que vous utilisez dans votre propre contrôleur de vue, c'est pourquoi votre problème se produit.

+0

Merci, j'ai légèrement modifié ma question, je n'utilise pas de reconnaissance gestuelle sur le ChildViewController, l'utilisateur place simplement son doigt sur l'écran dans la vue enfant et le MPFlipViewController qui est sur le parent absorbe le toucher et déplace le ' page ' – theiOSDude

+0

J'ai mis à jour la réponse. Mais le contrôleur de vue enfant réagit-il aux contacts qu'il reçoit? – johnyu