I have 3 UIViews, layered on top of one large uiview. I want to know if the user touches the top one and not care about the other ones. I will have a couple of buttons in the second UIView and a UITable in the 3rd UIView.
Problem is I turn userInteractionEngabled on on the first view and that works, but all the other views respond in the same way even if I turn it off. If I disable userInteractionEnabled on self.view none of them respond. I also can't detect which view was touched in the touchesBegan delegate method.
My code:
UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 150)];
aView = userInteractionEnabled = YES;
[self.view addSubview:aView];
UIView *bView = [[UIView alloc] initWithFrame:CGRectMake(0, 150, 320, 50)];
bView.userInteractionEnabled = NO;
[self.view addSubview:bView];
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
//This gets called for a touch anywhere
}
My swift version to check that touch took place in infoView:
swift code:
This worked for me:
In my case the UIView I wanted to find was not returned by the hitTest. But the following code worked better:
In order to check whether certain view inside another view was touched you can use hitTest.
In your custom implementation of touchesBegan check every touch in touches set. The point for hitTest method can be obtained using
method, where the view is your superView (the one that contains other views).
EDIT: Here's a fast custom implementation:
I hope this was helpful, Paul
This can also be done the following way.
First find the location of the touch in the view you care about:
Then see if the point is within the bounds of the view:
Then if it's within bounds, perform your action.
This can be done with one statement, which for example, can be used directly within an if statement: