UITapGestureRecognizer no se desencadena en UIImageView creado mediante progtwigción

Estoy usando XCode 4.5.1.

<UIGestureRecognizerDelegate> en el file .h y en el inicio del file .m

 @interface FirstViewController () @property (nonatomic, strong) UIImageView *img1; @end 

Luego en viewDidLoad , creando UIImageView programáticamente como

 self.img1 = [[UIImageView alloc] initWithFrame:CGRectMake(50, -30, 44, 44)]; [self.img1 setImage:[UIImage imageNamed:@"image1.png"]]; [self.img1 setAlpha:0.8]; [self.img1 setHidden:NO]; [self.img1 setUserInteractionEnabled:YES]; [self.img1 setTag:901]; 

Y entonces

 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(guessTapObject:)]; tap.numberOfTapsRequinetworking = 1; tap.numberOfTouchesRequinetworking = 1; tap.delegate = self; [self.img1 addGestureRecognizer:tap]; [self.view addSubview:self.img1]; [self.view bringSubviewToFront:self.img1]; 

Y al final

 - (void)guessTapObject:(UITapGestureRecognizer *) gesture { // guessing the image UIImageView *tapImageView = (UIImageView*) gesture.view; NSLog(@"Gesture Tag: %d", tapImageView.tag); } 

Tengo 4 imágenes diferentes y las crea mediante progtwigción como se describe anteriormente. Y aplicando la animation para moverlos de arriba a abajo.

Quiero que cuando el usuario pulse en la image, debería animar y desaparecer (conozco ese código). Pero el código no está activando el evento tap. Puse el punto de interrupción en el inicio de la function guessTapObject , pero no vaya nunca.

En la statement UITapGestureRecognizer , la debugging muestra que guessTapObject está conectado al reconocedor para realizar la acción de toque.

Por favor, ¿por qué el evento tap no está activando su método selector?

Gracias por su ayuda de antemano.


Editado: también intenté con for loop tener reconocimiento de gestos por separado para cada vista de image

 for (UIView * view in self.view.subviews) { if (view.tag > 900){ UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(guessTapObject:)]; tap.numberOfTapsRequinetworking = 1; tap.numberOfTouchesRequinetworking = 1; // tap.delegate = self; [view addGestureRecognizer:tap]; NSLog(@"tapView: %@", tap.view); NSLog(@"tap: %i", tap.enabled); } } 

Estaba atrapado en un problema similar … Asegúrate de que imageView se establezca como verdadero para userInteraction ..

 imageView.userInteractionEnabled = YES; 

¡Funcionó para mí!

Mira esto
Agregue el siguiente código a su controller de vista

  • En el file viewController.h

     @property (nonatomic, strong) UIImageView *img1; @property (nonatomic, strong) UIImageView *img2; @property (nonatomic, strong) UIImageView *img3; 
  • En el file viewController.m
    Inside viewDidLoad Method

     // Init Image 1 self.img1 = [[UIImageView alloc] initWithFrame:CGRectMake(50, 30, 44, 44)]; [self.img1 setImage:[UIImage imageNamed:@"image1_name.jpg"]]; [self.img1 setAlpha:0.8]; [self.img1 setHidden:NO]; [self.img1 setUserInteractionEnabled:YES]; [self.img1 setTag:901]; // Init Image 2 self.img2 = [[UIImageView alloc] initWithFrame:CGRectMake(100, 30, 44, 44)]; [self.img2 setImage:[UIImage imageNamed:@"image2_name.jpg"]]; [self.img2 setAlpha:0.8]; [self.img2 setHidden:NO]; [self.img2 setUserInteractionEnabled:YES]; [self.img2 setTag:902]; // Init Image 3 self.img3 = [[UIImageView alloc] initWithFrame:CGRectMake(50, 130, 44, 44)]; [self.img3 setImage:[UIImage imageNamed:@"image3_name.jpg"]]; [self.img3 setAlpha:0.8]; [self.img3 setHidden:NO]; [self.img3 setUserInteractionEnabled:YES]; [self.img3 setTag:903]; // Add Images to view [self.view addSubview:self.img1]; [self.view bringSubviewToFront:self.img1]; [self.view addSubview:self.img2]; [self.view bringSubviewToFront:self.img2]; [self.view addSubview:self.img3]; [self.view bringSubviewToFront:self.img3]; // Set Tap Gesture to each image of view for (UIView * view in self.view.subviews) { if (view.tag > 900){ UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(guessTapObject:)]; tap.numberOfTapsRequinetworking = 1; tap.numberOfTouchesRequinetworking = 1; [view addGestureRecognizer:tap]; NSLog(@"tapView: %@", tap.view); NSLog(@"tap: %i", tap.enabled); } } 

Asegúrese de que las imágenes deben agregarse antes para el bucle (agregando TapGesture usando la matriz de la subvista)

Resolví aplicando un gesto en la vista, en lugar de cada image por separado.

[self.view addGestureRecognizer:tap];

y luego en la function guessTapObject / selector guessTapObject , utilicé esto

 CGPoint tapLocation = [gesture locationInView:self.view]; // gives the tap coordinates for (UIView * view in self.view.subviews) { // gives view by iterating on each subview CGRect dropRect = [[[view layer] presentationLayer] frame]; // specific way of getting the frame with respect to its layer if(CGRectContainsPoint(dropRect, tapLocation)){ // checks for tap in the boundaries of view frame if (view.tag > 900) // my specific view // done what i want to do with that specific one // as i removed it from my superview } } }