iOS - comment transférer des contacts vers le sous-jacent


1

J'ai trois UIView de la même taille empilés les uns sur les autres. Le plus haut est transparent et seulement utilisé pour détecter des contacts. Le type de toucher détecté déterminera laquelle des deux autres vues sous-jacentes je souhaite recevoir les événements tactiles. Une fois la vue la plus haute terminée avec le toucher, je dois transférer les événements tactiles à la vue sous-jacente correcte. Comment puis je faire ça?

EDIT - J'ajoute mon code de détection tactile. C'est dans MainViewController, dont la vue contient les 3 sous-vues.

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

    for (UITouch *touch in touches) 
    { 
     if (touch.view == self.touchOverlay) { 
      CGPoint touchLocation = [touch locationInView:touch.view]; 

      //do a bunch of math to determine which view should get the touches. 
      if (viewAshouldGetTouches) //forward to viewA 
      if (viewBshouldGetTouches) //forward to viewB 


     } 
    } 
} 
  0

Toutes les sous-vues d'UIView d'une seule vue sont-elles? 01 févr.. 132013-02-01 20:42:21

  0

@ Putz1103 oui, ils sont sous-vues d'une seule vue. Je vérifie touchesMoved, etc. dans le contrôleur de vue que contient les vues. 01 févr.. 132013-02-01 20:46:42

1

Vous devez faire cela en créant une sous-classe UIView pour votre vue de dessus et en remplaçant la méthode suivante:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    // UIView will be "transparent" for touch events if we return NO 
    return (point.y < MIDDLE_Y1 || point.y > MIDDLE_Y2); 
} 
  0

Mais si je fais cela, est-ce que je peux toujours vérifier la vue de dessus pour les touches dans les touchesMoved du contrôleur de vue principale? C'est là que je détermine quelle vue sous-jacente devrait avoir les retouches. 01 févr.. 132013-02-01 20:45:44


3

Faites vos deux sous-vues setUserInteractionEnabled:NO et gérer toutes les touches du parent. Ensuite, en fonction du type de contact, envoyez la vue correcte à un événement tactile programmatique. Ensuite, vous n'avez pas besoin de votre vue claire sur le dessus. Fondamentalement, vous allez coordonner les événements tactiles de bas en haut au lieu d'aller en haut -> bas-> milieu.

  0

J'ai ajouté ma méthode touchesMoved ci-dessus. Pouvez-vous donner un exemple d'envoi d'un événement tactile programmatique à l'intérieur de touchesMoved? Fondamentalement, les deux vues contiennent des vues de défilement qui doivent défiler normalement si la vue reçoit des événements tactiles. 01 févr.. 132013-02-01 21:01:28

  0

Appelez '[view1 touchesBegan: touches avecEvent: event];' depuis l'intérieur de la touche. Je ne suis pas certain que le scrollview fonctionnera correctement en utilisant ceci, mais dans ma tête il devrait le faire. 01 févr.. 132013-02-01 21:30:55

  0

J'ai besoin de view1 pour recevoir les événements touchesMoved, mais pas de touchesBegan. Appeler les touchesMoved from inside touchesMoved semble provoquer une boucle infinie. 01 févr.. 132013-02-01 21:45:53

  0

Est-ce que votre "view1" appelle [super touchesMoved ...]? Parce que cela causerait un problème. 01 févr.. 132013-02-01 21:50:23

  0

non, view1 n'est pas une sous-classe. C'est juste une vue qui est à l'écran, sous la vue de superposition. 01 févr.. 132013-02-01 21:59:19

  0

Ouais, alors ma réponse est merde. Ce que vous pouvez faire à la place est que votre vue "claire" analyse les événements tactiles, puis connaisse sa classe et appelle les événements tactiles dans les vues de classe de superview. Assurez-vous ensuite que setuserinteraction est activé sur l'ensemble de la vue. 02 févr.. 132013-02-02 02:04:22

  0

J'ai essayé cela. touchesMoved est appelé dans le contrôleur de vue, mais les scrollviews n'obtiennent pas les événements tactiles. 02 févr.. 132013-02-02 22:06:00