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