Search code examples
iphoneiosuiimageviewxcode4.5uitapgesturerecognizer

UITapGestureRecognizer not triggering on UIImageView created programmatically


I'm using XCode 4.5.1 .

I added <UIGestureRecognizerDelegate> in .h file and in the start of .m file

@interface FirstViewController ()

@property (nonatomic, strong) UIImageView *img1;

@end

Then in viewDidLoad, creating UIImageView programmatically like

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];

And then

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(guessTapObject:)];
tap.numberOfTapsRequired = 1;
tap.numberOfTouchesRequired = 1;
tap.delegate = self;

[self.img1 addGestureRecognizer:tap];

[self.view addSubview:self.img1];
[self.view bringSubviewToFront:self.img1];

and at the end

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

I have 4 different images and creating them programmatically as described above. And applying the animation to move them from top to bottom.

I want that when user tap on the image, it should animate and disappear(i know that code). But the code is not triggering the tap event. I put the breakpoint on the start of the guessTapObject function, but don't go there ever.

At UITapGestureRecognizer declaration, debugging shows that guessTapObject is attached to the recognizer to perform the tap action.

Please help why tap event is not triggering its selector method???

Thanks for your help in advance.


Edited: i also tried with for loop to have gesture recognizer separately for every imageview

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

Solution

  • i solved by applying gesture on view, instead of each image view separately.

    [self.view addGestureRecognizer:tap];

    and then in handler/selector guessTapObject function, i used this

    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
            }
        }
    }