2011-08-02 2 views
6

I ont deux vuesdétecter le contact sur une vue derrière une autre vue?

  • la vue de dessus a une certaine opacité et certaines régions transparentes
  • la vue de dessous a quelques boutons cliquables.

La vue de dessus couvre complètement la vue de dessous, mais comme la vue de dessus a des zones transparentes, la vue de dessous est toujours visible. MAIS, je ne peux plus détecter les clics sur les boutons de la vue du bas, vu que topview la bloque, que dois-je faire?

Y a-t-il moyen de laisser la vue de dessus passer les touches à la vue de dessous?

Répondre

4

Ma solution pour ma propre question, j'espère que cela aidera quelqu'un.

En vue de face, écoutez touchesEnded:withEvent délégué.

Lorsque ce délégué se déclenche, vous savez qu'un utilisateur touche la vue de face.

Ensuite, vous devez vérifier si la position du doigt touche des zones spéciales dans la vue INFÉRIEURE.

Que faire est:

1) Convertir le point à par rapport à la vue de dessous:

UITouch *touch = [touches anyObject]; 
CGPoint touchPointInLowerView = [touch locationInView:self.lowerViewController.view]; 
BOOL isLowerButtonClicked = [self.lowerViewController isFingerOnYourButton:touchPointInLowerView]; 
if(isLowerButtonClicked) 
{ 
// lower button clicked 
} 

2) Dans la vue inférieure

- (BOOL) isFingerOnYourButton:(CGPoint)point 
{ 
return CGRectContainsPoint(self.aButton.frame, point); 
} 

de tour est joué. De cette façon, nous pouvons détecter les clics dans la vue du bas, même si elle est bloquée par une autre vue interactive sur le dessus.

+0

J'ai besoin de faire cela, mais je ne comprends pas comment: Écouter les touches finies: delegueEvent, etc avec une vue sous-classée. Appelez-moi, mais j'ai besoin de tout voir. – Morkrom

1

Désactiver l'interaction de l'utilisateur dans la vue de dessus qui bloque la vue de dessous:

topView.userInteractionEnabled = NO; 
+0

Malheureusement, la vue de dessus est une vue défilable ... l'interaction est nécessaire.si .. – mkto

1

Si vous ne voulez pas la vue de dessus (ou l'un de ses sous-vues) pour répondre à des touches du tout, vous pouvez définir la propriété userInteractionEnabled sur NO pour cette vue et l'utiliser. Dans le cas contraire, il est préférable de remplacer pointInside:withEvent: ou hitTest:withEvent: dans la classe de la vue de dessus. Si la vue de dessus et la vue de dessous sont des frères et sœurs, cela devrait suffire pour renvoyer NO de pointInside:withEvent:; Si elles sont séparées dans la hiérarchie de vue, vous devrez peut-être remplacer hitTest:withEvent: pour renvoyer explicitement la vue de dessous pour les zones transparentes.

+0

Malheureusement, la vue de dessus est une vue défilable ... une interaction est nécessaire. Je vais regarder dans votre deuxième proposition ... merci. Je mettrai à jour ce que j'ai eu. En attendant, quelqu'un a d'autres suggestions faites le moi savoir. – mkto

Questions connexes