2010-05-08 10 views
28

Tengo 3 UIViews, superpuestas en la parte superior de una gran uiview. Quiero saber si el usuario toca el superior y no se preocupa por los otros. Tendré un par de botones en la segunda UIView y una UITable en la tercera UIView.Detectar si se tocó cierto UIView entre otras UIViews

Problema es que activeInteractionEngable en la primera vista y funciona, pero todas las otras vistas responden de la misma manera, incluso si lo desactivo. Si deshabilito userInteractionEnabled en self.view, ninguno de ellos responde. Tampoco puedo detectar qué vista se tocó en el método delegate touchesBegan.

Mi código:

UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 150)]; 
aView = userInteractionEnabled = YES; 
[self.view addSubview:aView]; 

UIView *bView = [[UIView alloc] initWithFrame:CGRectMake(0, 150, 320, 50)]; 
bView.userInteractionEnabled = NO; 
[self.view addSubview:bView]; 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
//This gets called for a touch anywhere 
} 

Respuesta

58

Con el fin de comprobar si cierta visión dentro de otro punto de vista fue tocado puede utilizar hitTest.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; 

En su implementación personalizada de toques Beba comprobar cada toque en el conjunto de toques. El punto para el método hitTest se puede obtener usando

- (CGPoint)locationInView:(UIView *)view; 

método, donde la vista es su supervista (la que contiene otros puntos de vista).

EDIT: He aquí una rápida implementación personalizada:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    CGPoint locationPoint = [[touches anyObject] locationInView:self]; 
    UIView* viewYouWishToObtain = [self hitTest:locationPoint withEvent:event]; 
} 

Espero que esto era útil, Paul

+0

Lo siento, sé que estás en el camino correcto, pero me cuesta un poco entender exactamente lo que dices. Estoy obteniendo el punto tocado por los toques desde su ubicación en la vista y podría técnicamente averiguar cuál fue la vista que el usuario tocó de esto, pero no estoy seguro de cómo se llama a hittest – Rudiger

+2

. Se debe tener en cuenta que invoca 'locationInView:' con un parámetro de ' nil' le da la ubicación 'CGPoint' en el espacio de coordenadas de la ventana principal. –

26

En mi caso el UIView que quería encontrar no fue devuelto por el hitTest. Pero el siguiente código funcionó mejor:

CGPoint locationPoint = [[touches anyObject] locationInView:self.view]; 
    CGPoint viewPoint = [myImage convertPoint:locationPoint fromView:self.view]; 
    if ([myImage pointInside:viewPoint withEvent:event]) { 
     do something 
    } 
+0

También encontré problemas con la respuesta aceptada. Por alguna razón, esto funcionó también. Tenga en cuenta que también estaba tratando de detectar hits en UIImageView y no solo en UIView si eso es relevante. –

8

En touchesBegan cheque que la vista tocado es el que usted desea, resolvió el problema para mí cuando traté de identificar si el usuario toca una ImageView específica.

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

    if ([touch view] == imageView) { 
     ... your code to handle the touch 
    } 
    ... 

Si se ajusta el contenido de la vista Diamensions asegúrese de cambiar el tamaño de vista consecuencia de lo contrario se reconocerá evento de contacto incluso en la zona donde no en lo que el contenido de la vista. En mi caso, cuando traté de mantener la proporción de la imagen con UIViewContentModeScaleAspectFit aunque la imagen se ajustó como se requería en los espacios en blanco, las áreas de evento táctil también quedaron atrapadas.

12

Esto también se puede hacer de la siguiente manera.

En primer lugar encontrar la ubicación del contacto en la vista que se preocupan por:

CGPoint location = [touches.anyObject locationInView:viewYouCareAbout]; 

ver entonces si el punto está dentro de los límites de la vista:

BOOL withinBounds = CGRectContainsPoint(viewYouCareAbout.bounds, location); 

A continuación, si está dentro de los límites , realiza tu acción.

Esto se puede hacer con una sola declaración, que, por ejemplo, se puede utilizar directamente en una sentencia if:

CGRectContainsPoint(viewYouCareAbout.bounds, [touches.anyObject locationInView:viewYouCareAbout]) 
8

código SWIFT:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     if let touch = touches.first { 
      if touch.view == self.view { 
       self.hideInView() 
      } else { 
       return 
      } 

     } 
    } 
+0

excelente respuesta para swift. Compartir el amor con el voto de arriba. –

0

Esto funcionó para mí:

func respondToGesture(gesture: UIGestureRecognizer) { 
    let containsPoint = CGRectContainsPoint(targetView.bounds, gesture.locationInView(targetView)) 
} 
Cuestiones relacionadas