¿Cómo puedo detectar el evento táctil de un UIImageView?

98

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?

Gracias.

ebaccount
fuente
En esta situación, yo usaría (y creo que debería) usar un UIButton personalizado en su lugar.
titaniumdecoy
Verifique la versión de Swift Respuesta http://stackoverflow.com/a/41328885/3177007
Mohamed Jaleel Nazir

Respuestas:

137

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

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

Puede usar 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 jugar con las cosas táctiles.

Kendall Helmstetter Gelner
fuente
Agregué un botón en la barra de navegación y también puedo manejar eventos táctiles. Sin embargo, quiero agregar una imagen redonda en este botón. ¿Podría decirme cómo puedo hacerlo mediante programación? Además, ¿podría decirme cómo puedo configurar la propiedad del botón como "personalizada" mediante programación?
ebaccount
Mire los documentos para UIButton: necesita establecer imágenes de fondo para un estado de control, querrá diferentes imágenes para Normal vs. Seleccionado / Resaltado. El estilo del botón es lo que estableciste en UIButtonStyleCustom, creo; nuevamente, mira los documentos para la propiedad de estilo en UIButton.
Kendall Helmstetter Gelner
1
¿No es un poco exagerado agregar un UIButton encima de UIImageView? Está agregando un objeto adicional, mientras que simplemente podría implementar los métodos de toque del objeto UIImageView ya existente. ¿No?
samvermette
32
Si observa el tamaño de un UIButton en la memoria, es prácticamente nada y solo tiene unos pocos por pantalla. Lo que obtienes gratis es todo el cableado de acción del objetivo para diferentes estados (como retocar en el interior) y también un comportamiento agradable, como no disparar cuando presionas hacia abajo pero deslizas un dedo hacia un lado. Básicamente, los botones son uno de los objetos más finamente elaborados en todo el sistema y pensar que vas a hacer un código táctil personalizado que funcione mejor es una locura. Use lo que sea barato y funcione bien, guarde el trabajo personalizado para cosas que los frameworks aún no manejan por usted.
Kendall Helmstetter Gelner
6
También puede superponer un UIControl si todo lo que necesita son eventos táctiles (a través de addTaget: action: forControlEvents :). Es un poco más económico que un UIButton que tiene imágenes y varios estados. Además, utilizo condicionales de preprocesador para cambiar el color de fondo del control superpuesto a rosa para poder ver exactamente dónde están (y recordar que existen :-).
Jeff
115

A UIImageViewse deriva de a UIViewque se deriva de, UIResponderpor lo que está listo para manejar eventos táctiles. Usted querrá dar el touchesBegan, touchesMovedytouchesEnded los métodos y ellos se llama si el usuario toca la imagen. Si todo lo que desea es un evento de toque, es más fácil usar un botón personalizado con la imagen configurada como la imagen del botón. Pero si desea un control más fino de los golpes, movimientos, etc., este es el camino a seguir.

También querrá ver algunas cosas más:

  • Anule canBecomeFirstRespondery devuelva YES para indicar que la vista puede convertirse en el foco de eventos táctiles (el valor predeterminado es NO).

  • Establezca la userInteractionEnabledpropiedad en YES. El valor predeterminado para UIViewses SÍ, pero para UIImageViewses NO, por lo que debe activarlo explícitamente.

  • Si desea responder a eventos multitáctiles (es decir, pellizcar, hacer zoom, etc.), querrá configurarlo multipleTouchEnableden SÍ.

Ramin
fuente
Intenté eso, pero no obstante no recibo los toques Comenzaron los eventos ... ¿por qué?
Markus
5
@Markus: Tuve el mismo problema, pero lo solucioné estableciendo userInteractionEnabledSÍ en mi vista de padres. Ver stackoverflow.com/questions/5887305/…
Saxon Druce
51

Para agregar un evento táctil a un UIImageView, use 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.

Sip.
fuente
userInteractionEnabled = true es la parte que es fácil de olvidar, gracias.
Michael Peterson
23

También puede agregar un UIGestureRecognizer. No requiere que agregue un elemento adicional en su jerarquía de vista, pero aún le proporciona todo el código bien escrito para manejar eventos táctiles con una interfaz bastante simple:

    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];
spolu
fuente
10
NO olvide configurar UserInteractionEnabled para imgView_
Blanco anónimo
13

He estado en diferentes hilos en las últimas horas tratando de encontrar una solución a mi problema, sin éxito. Veo que muchos desarrolladores comparten este problema y creo que la gente de aquí lo sabe. Tengo varias imágenes dentro de unUIScrollView , tratando de obtener eventos de tap en ellas.

no UIImangeViewobtengo ningún evento de un , pero obtengo un evento de un similar UILablecon parámetros muy similares que le estoy configurando. bajo IOS 5.1.

Ya hice lo siguiente:

  1. establezca setUserInteractionEnabled en YES tanto para `UIImageView como para la vista principal.
  2. establezca setMultipleTouchEnabled en YES para UIImageView.
  3. Intenté subclasificar UIImageView, no ayudó a nadie.

Adjuntando un poco de código a continuación, en este código inicializo a UIImageViewy UILabel, la etiqueta funciona bien en términos de eventos de activación. Intenté 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 dijo, se recibe el grifo de la etiqueta.

ilan
fuente
6

En lugar de hacer un UIImageView táctil y luego colocarlo en la barra de navegación, debe crear un UIBarButtonItem, que crea a partir de un UIImageView.

Primero haz la vista de imagen:

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

Luego, haga que el elemento de botón de barra salga de su vista de imagen:

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

Luego agregue el elemento del botón de la barra a su barra de navegación:

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

Recuerde que este código va al controlador de vista que está dentro de una matriz de controlador de vista del controlador de navegación. Básicamente, este "elemento de botón de barra con apariencia de imagen táctil" solo aparecerá en la barra de navegación cuando se muestre este controlador de vista. Cuando presiona otro controlador de vista, este elemento del botón de la barra de navegación desaparecerá ~

Yujean
fuente
3

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

Dentro de este método, pruebe si alguno de los UITouchtoques cae dentro de los límites de la UIImageViewinstancia (digamos que se llama imageView).

Es decir, ¿el CGPointelemento se [touch locationInView]cruza con el CGRectelemento [imageView bounds]? Busque la función CGRectContainsPointpara ejecutar esta prueba.

Alex Reynolds
fuente
Gracias por su respuesta. He añadido la vista como esta: [navBar addSubview: self.pImage]; // agregado como una subvista de la barra de navegación. He anulado la función pero nunca se llama a la función. Sin embargo, he establecido la propiedad userInteractionEnabled de UIImageView en SÍ. ¿Me estoy perdiendo algo?
ebaccount
Echa un vistazo al método touchesBegan: withEvent :. Hay muchos ejemplos en los motores de búsqueda de cómo funciona esto.
Alex Reynolds
1

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

o

Puede agregar el gesto de toque a un UIImageView para que obtenga la acción de clic cuando toque en UIImageView.

Hilaj
fuente
0

Para aquellos de ustedes que buscan una solución Swift 4 para esta respuesta. Puede utilizar lo siguiente para detectar un evento táctil en un UIImageView.

let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true

Luego deberá definir su selector de la siguiente manera:

@objc func imageViewTapped() {
    // Image has been tapped
}
Josh
fuente
-2

Agregue un gesto en esa vista.Agregue una imagen en esa vista, entonces también estaría detectando un gesto en la imagen. ¿Podría intentarlo con el método delegado de evento táctil y, en ese caso, también podría estar detectando? Gracias

usuario1240409
fuente