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.
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.
Respuestas:
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.
A UIImageView
se deriva de a UIView
que se deriva de, UIResponder
por lo que está listo para manejar eventos táctiles. Usted querrá dar el touchesBegan
, touchesMoved
ytouchesEnded
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 canBecomeFirstResponder
y devuelva YES para indicar que la vista puede convertirse en el foco de eventos táctiles (el valor predeterminado es NO).
Establezca la userInteractionEnabled
propiedad 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, hacer zoom, etc.), querrá configurarlo multipleTouchEnabled
en SÍ.
userInteractionEnabled
SÍ en mi vista de padres. Ver stackoverflow.com/questions/5887305/…
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.
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];
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 UIImangeView
obtengo ningún evento de un , pero obtengo un evento de un similar UILable
con parámetros muy similares que le estoy configurando. bajo IOS 5.1.
Ya hice lo siguiente:
UIImageView
.UIImageView
, no ayudó a nadie.Adjuntando un poco de código a continuación, en este código inicializo a UIImageView
y 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.
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á ~
Lo que podría querer hacer es anular el touchesBegan:withEvent:
método de la UIView
(o subclase) que contiene su UIImageView
subvista.
Dentro de este método, pruebe si alguno de los UITouch
toques cae dentro de los límites de la UIImageView
instancia (digamos que se llama imageView
).
Es decir, ¿el CGPoint
elemento se [touch locationInView]
cruza con el CGRect
elemento [imageView bounds]
? Busque la función CGRectContainsPoint
para ejecutar esta prueba.
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
}
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