2009-05-12 9 views
94

He colocado una imagen (UIImageView) en la barra de navegación. Ahora quiero detectar el evento táctil y quiero manejar el evento. ¿Podrías decirme cómo puedo hacer eso?cómo puedo detectar el evento táctil de un UIImageView

Gracias.

+0

En esta situación, yo (y creo que deberías) usar un UIButton personalizado en su lugar. – titaniumdecoy

+0

Verificar ** Respuesta de la versión Swift ** [http://stackoverflow.com/a/41328885/3177007](http://stackoverflow.com/a/41328885/3177007) –

Respuesta

3

Lo que podría querer hacer es anular el método touchesBegan:withEvent: del UIView (o subclase) que contiene su subvista UIImageView.

Dentro de este método, compruebe si alguno de los toques UITouch cae dentro de los límites de la instancia UIImageView (digamos que se llama imageView).

Es decir, ¿el elemento CGPoint[touch locationInView] se cruzan con el elemento [imageView bounds]CGRect? Busque en la función CGRectContainsPoint para ejecutar esta prueba.

+0

Gracias por su respuesta. He agregado la vista de esta manera: [navBar addSubview: self.pImage]; // agregado como una subvista de la barra de navegación. He anulado la función pero la función nunca se llama. Sin embargo, he establecido la propiedad userInteractionEnabled del UIImageView en YES. ¿Me estoy perdiendo algo? – ebaccount

+0

Echa un vistazo al método touchesBegan: withEvent :. Hay muchos ejemplos en los motores de búsqueda de cómo funciona esto. –

113

Un UIImageView se deriva de una UIView que se deriva de UIResponder para que esté listo para manejar eventos de toque. Deberá proporcionar los métodos touchesBegan, touchesMoved y touchesEnded y recibirán una llamada si el usuario toca la imagen. Si todo lo que desea es un evento tap, es más fácil usar un botón personalizado con la imagen configurada como imagen del botón. Pero si quieres un control más fino sobre grifos, movimientos, etc., este es el camino a seguir.

También querrá mirar un par de cosas más:

  • Anulación canBecomeFirstResponder y volver Sí para indicar que la vista puede ser el centro de eventos de toque (el valor predeterminado es NO).

  • Establezca la propiedad userInteractionEnabled en YES. El valor predeterminado para UIViews es SÍ, pero para UIImageViews es NO, por lo que debe activarlo explícitamente.

  • Si desea responder a eventos multitáctiles (es decir, pellizcar, ampliar, etc.), querrá establecer multipleTouchEnabled en SÍ.

+0

Lo intenté, pero nunca recibí los eventos touchesBegan ... ¿por qué? – Markus

+5

@Markus: Tuve el mismo problema, pero lo solucioné estableciendo 'userInteractionEnabled' en YES en mi vista principal. Ver http://stackoverflow.com/questions/5887305/uiview-user-interaction-enabled-false-on-parent-but-true-on-child –

135

En términos prácticos, no haga eso.

En su lugar, agregue un botón con estilo personalizado (sin gráficos de botones a menos que especifique imágenes) sobre UIImageView. Luego adjunte los métodos que desee para eso.

Puede utilizar esa técnica para muchos casos en los que realmente desea que un área de la pantalla actúe como un botón en lugar de interferir con la función táctil.

+0

He agregado un botón en la barra de navegación y también puedo manejar el touch eventos. Sin embargo, quiero agregar una imagen redonda en este botón. ¿Podrías decirme cómo puedo hacerlo programáticamente? Además, ¿podría decirme cómo puedo establecer la propiedad del botón en "personalizado" mediante programación? – ebaccount

+0

Mire los documentos para UIButton: necesita establecer imágenes de fondo para un estado de control, querrá diferentes imágenes para Normal vs. Seleccionado/Destacado. El estilo del botón es lo que configura en UIButtonStyleCustom, creo que, de nuevo, consulte los documentos de la propiedad de estilo en UIButton. –

+0

¿No está agregando un UIButton encima del UIImageView un poco más arriba? Está agregando un objeto adicional, mientras que podría implementar los métodos de toques del objeto UIImageView ya existente. ¿No? – samvermette

6

En lugar de hacer un UIImageView tangible y colocarlo en la barra de navegación, solo debes crear un UIBarButtonItem, que puedes crear a partir de un UIImageView.

En primer lugar hacer la vista de la imagen:

UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]]; 

Luego hace el artículo barbutton fuera de su vista de la imagen:

UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView]; 

A continuación, añadir el artículo botón de la barra de la barra de navegación:

self.navigationItem.rightBarButtonItem = yourBarButtonItem; 

Recuerde que este código entra en el controlador de vista que se encuentra dentro de un controlador de navegación viewcontrolle r matriz. Así que, básicamente, este "elemento táctil del botón de la barra con aspecto de imagen" solo aparecerá en la barra de navegación cuando este controlador de vista se muestre. Cuando presione otro controlador de vista, este elemento del botón de la barra de navegación desaparecerá ~

23

También puede agregar un UIGestureRecognizer. No requiere que añadir un elemento adicional en la jerarquía de la vista, pero aún le proporcionará todo el código bien escrito para el manejo de eventos de toque con una interfaz bastante sencilla:

UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] 
              initWithTarget:self action:@selector(handleSwipe:)]; 
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight; 
    [imgView_ addGestureRecognizer:swipeRight];   
    [swipeRight release]; 
    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] 
              initWithTarget:self action:@selector(handleSwipe:)]; 
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft; 
    [imgView_ addGestureRecognizer:swipeLeft]; 
    [swipeLeft release]; 
+10

NO olvide establecer UserInteractionEnabled para imgView_ –

+0

Este es un enfoque muy limpio. Me permitió agregar un controlador de acceso sin cambios a mi (ya complicada) configuración y manejo de Vista. Consulte "Más ..." en https://developer.apple.com/library/ios/documentation/UIKit/reference/UITapGestureRecognizer_Class/index.html para obtener un manejador de Tap sencillo. – Brandyn

12

he estado en diferentes hilos de las últimas horas tratando de encontrar una solución para mi problema, fue en vano. Veo que muchos desarrolladores comparten este problema, y ​​creo que la gente de aquí lo sabe. Tengo varias imágenes dentro de un UIScrollView, tratando de obtener eventos tap sobre ellas.

no obteniendo ningún evento de un UIImangeView, pero obtengo un evento de un UILable similar con parámetros muy similares a los que estoy estableciendo. en IOS 5.1.

ya he hecho lo siguiente:

  1. conjunto setUserInteractionEnabled a SÍ, tanto para los padres y `UIImageView vista.
  2. set setMultipleTouchEnabled to YES for UIImageView.
  3. Intentó la subclase UIImageView, no ayudó ninguna.

Colocación de un cierto código a continuación, en este código que inicializar la vez un UIImageView y UILabel, la etiqueta funciona bien en términos de arranques. Traté de mantener el código irrelevante. Gracias chicos, Ilan

UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)]; 
single_view.image=img; 
single_view.layer.zPosition=4; 

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)]; 
[single_view addGestureRecognizer:singleTap]; 
[single_view setMultipleTouchEnabled:YES]; 
[single_view setUserInteractionEnabled:YES]; 
[self.myScrollView addSubview:single_view];  
self.myScrollView.userInteractionEnabled=YES; 

UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; 
testLabel.backgroundColor=[UIColor redColor]; 
[self.myScrollView addSubview:testLabel]; 
[testLabel addGestureRecognizer:singleTap]; 
[testLabel setMultipleTouchEnabled:YES]; 
[testLabel setUserInteractionEnabled:YES]; 
testLabel.layer.zPosition=4; 

y el método que maneja el evento:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture 
{ 
    UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil]; 
    NSLog(@"Touch event on view: %@",[tappedView class]); 
} 

Como se ha dicho, se recibe la llave de la etiqueta.

-2

Añadir gesto en esa imagen view.add en esa vista, entonces sería detectar gesto en la imagen también. Podría intentar con el método de delegado de evento táctil entonces en ese caso también podría estar detectando. Gracias

48

Para agregar un evento en contacto a un UIImageView utilizar lo siguiente en su .m

UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)]; 

[myImageView setUserInteractionEnabled:YES]; 

[myImageView addGestureRecognizer:newTap]; 


-(void)myTapMethod{ 
    // treat image tap 
} 

espero que ayude.

+3

Esta es una manera extremadamente simple y limpia de hacer clic en una vista de imagen. Debería ser la mejor respuesta. ¡Gracias! – Jason

+0

me alegra que lo haya encontrado útil. feliz codificación! –

+0

userInteractionEnabled = true es la parte que es fácil de olvidar, gracias. –

0

Primero debe colocar un UIButton luego puede agregar una imagen de fondo para este botón o necesita colocar un UIImageView sobre el botón.

Cuestiones relacionadas