Find which child view was tapped when using UITapGestureRecognizer
Objective CIpadObjective C Problem Overview
How do I know on which of the the child views an event occurred when using UIGestureRecognizers?
According to the documentation:
> A gesture recognizer operates on > touches hit-tested to a specific view > and all of that view’s subviews.
As far as I can see, the 'view' property is
> The view the gesture recognizer is > attached to.
which will be the parent view.
Objective C Solutions
Solution 1 - Objective C
This will find the innermost descendant view at the event's location. (Note that if that child view has any interactive internal private grandchildren this code will find those too.)
UIView* view = gestureRecognizer.view;
CGPoint loc = [gestureRecognizer locationInView:view];
UIView* subview = [view hitTest:loc withEvent:nil];
In Swift 2:
let view = gestureRecognizer.view
let loc = gestureRecognizer.locationInView(view)
let subview = view?.hitTest(loc, withEvent: nil) // note: it is a `UIView?`
In Swift 3:
let view = gestureRecognizer.view
let loc = gestureRecognizer.location(in: view)
let subview = view?.hitTest(loc, with: nil) // note: it is a `UIView?`
Solution 2 - Objective C
For future users... I have got a better option now when world is not using obj-c anymore...
[sender view]
use it this way:
UITapGestureRecognizer * objTapGesture = [self createTapGestureOnView:myTextField];
[objTapGesture addTarget:self action:@selector(displayPickerView:)];
// add these methods
-(void)displayPickerView:(UITapGestureRecognizer*)sender
{
UITextField *textField = (UITextField*)[sender view];
NSLog(@"tag= %ld", (long)textField.tag);
}
-(UITapGestureRecognizer*)createTapGestureOnView:(UIView *)view
{
view.userInteractionEnabled = YES;
UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc]init];
tapGesture.numberOfTapsRequired = 1;
tapGesture.numberOfTouchesRequired = 1;
[view addGestureRecognizer:tapGesture];
return tapGesture;
}