2011-08-02 13 views
6

Tengo dos vistasdetectar contacto en una vista detrás de otra vista?

  • la vista superior tiene alguna algunas regiones transparentes
  • la vista inferior tiene algunos botones se puede hacer clic y opaca.

La vista superior cubre por completo la vista inferior, pero como la vista superior tiene áreas transparentes, la vista inferior aún se puede ver.

PERO, no puedo detectar los clics de botón en la vista inferior ya que topview lo está bloqueando, ¿qué debo hacer?

¿Hay alguna forma de permitir que la vista superior pase los toques a la vista inferior?

Respuesta

4

Mi solución para mi propia pregunta, espero que ayude a alguien.

En la vista frontal, escuche al delegado touchesEnded:withEvent.

Cuando se activa este delegado, usted sabe que un usuario está tocando la vista frontal.

A continuación, debe comprobar si la posición del dedo toca áreas especiales en la vista INFERIOR.

Lo que hay que hacer es:

1) convertir el punto en relación a la vista inferior:

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

2) En la vista inferior

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

listo. De esta manera, podemos detectar clics en la vista inferior, incluso si está bloqueada por otra vista interactiva en la parte superior.

+0

Necesito hacer esto, pero no entiendo cómo: Escuchar los toques terminados: con delegado de evento, etc. con una vista subclase. Llámame lo que sea, pero necesito verlo todo. – Morkrom

1

Desactivación de la interacción del usuario en la vista superior que está bloqueando la vista desde abajo:

topView.userInteractionEnabled = NO; 
+0

desafortunadamente la vista superior es una vista desplazable ... se necesita interacción.alto ... – mkto

1

Si no desea que la vista superior (o cualquiera de sus subvistas) para responder a los toques en absoluto, puede establecer la propiedad userInteractionEnabled en NO para esa vista y terminar con ella.

De lo contrario, su mejor opción es anular pointInside:withEvent: o hitTest:withEvent: en la clase de la vista superior. Si la vista superior y la vista inferior son hermanos, debería ser suficiente para devolver NO desde pointInside:withEvent:; si están más separados en la jerarquía de vista, es posible que deba sobrescribir hitTest:withEvent: para devolver explícitamente la vista inferior de las áreas transparentes.

+0

desafortunadamente la vista superior es una vista desplazable ... se necesita interacción. Analizaré tu segunda propuesta ... gracias ... la actualizaré, tengo algo. Mientras tanto, cualquiera tiene otras sugerencias házmelo saber. – mkto

Cuestiones relacionadas