Detecta si cierto UIView fue tocado entre otras UIViews

Tengo 3 UIViews, en capas sobre 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.

El problema es que active userInteractionEngabled en la primera vista y eso 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 } 

Para verificar si se tocó cierta vista dentro de otra vista, puede usar hitTest.

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

En su implementación personalizada de toques, comience a marcar 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 otras vistas).

EDITAR: Aquí hay una implementación personalizada rápida:

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

Espero que esto haya sido útil, Paul

En mi caso, la UIView que quería encontrar no fue devuelta por 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 } 

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

Primero encuentre la ubicación del toque en la vista que le interesa:

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

Luego, vea si el punto está dentro de los límites de la vista:

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

Luego, si está dentro de los límites, realice su acción.

Esto se puede hacer con una statement, que, por ejemplo, se puede usar directamente en una instrucción if:

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

código SWIFT:

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

En touchesBegan compruebe que la vista tocada es la que desea, me solucionó el problema cuando intenté identificar si el usuario había tocado un ImageView específico.

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if ([touch view] == imageView ) { ... your code to handle the touch } ... 

Si ajusta el contenido de los diamen- tios de vista, asegúrese de cambiar el tamaño de la vista, de lo contrario reconocerá el evento táctil incluso en el área donde haya contenido en 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 las áreas en blanco, el evento táctil de las áreas también quedó atrapado.

Mi versión rápida para verificar ese toque se llevó a cabo en infoView:

 override func touchesBegan(_ touches: Set, with event: UIEvent?) { guard let touch = touches.first, infoView.bounds.contains(touch.location(in: infoView)) else { return } print("touchesBegan") // Replace by your own code } // touchesBegan 

Esto funcionó para mí:

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