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 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Í.
userInteractionEnabledSÍ 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 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:
UIImageView.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.
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 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.
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