Find which child view was tapped when using UITapGestureRecognizer

Objective CIpad

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLK.View Question on Stackoverflow
Solution 1 - Objective CkennytmView Answer on Stackoverflow
Solution 2 - Objective Cjeet.chanchawatView Answer on Stackoverflow