I have a UITapGestureRecognizer
and a UIPanGestureRecognizer
on a UIView
with a SKScene
on it. The pan gesture recogniser moves a SKNode left to right, and I want the Tap gesture recogniser to detect a child of the SKNode that pans. Panning works fine, but I'm having trouble detecting taps - the Tap Gesture fires the relevant method, but I'm not sure how to convert the coordinates from the view to the scene to the node to detect if the tap is in one of the children nodes.
UIView (with gestures) → SKScene → Panning node → Children of panning node
How do I check a whether a tap gesture's touch coordinate is any given SKNode?
-(void)tapAction:(UITapGestureRecognizer*)sender{
if (sender.state == UIGestureRecognizerStateEnded)
{
// handling code
CGPoint touchLocation = [sender locationOfTouch:0 inView:sender.view];
NSLog(@"TAP %@", NSStringFromCGPoint(touchLocation)
);
for (SKLabelNode *node in _containerNode.children) {
if ([node containsPoint:[node convertPoint:touchLocation fromNode:self.parent]]) {
//This is where I want the tap to be detected.
}
CGPoint checkPoint = [node convertPoint:touchLocation fromNode:self.scene];
NSLog(@"CheckPoint %@", NSStringFromCGPoint(checkPoint)
);
//NSLog(@"iterating nodes");
if ([node containsPoint:checkPoint]) {
NSLog(@"touch match %@", node);
}
}
}
}
In the end I needed to do a couple more steps from what were suggested - converting from the SKView → SKScene and then to the SKNode which contained the nodes I was hit testing.
CGPoint touchLocation = [sender locationOfTouch:0 inView:sender.view];
CGPoint touchLocationInScene = [[self.scene view] convertPoint:touchLocation toScene:self.scene];
CGPoint touchLocationInNode = [self.scene convertPoint:touchLocationInScene toNode:_containerNode];
You should convert the View coordinates to Scene Coordinates using convertPointFromView:
CGPoint touchLocationInView = [sender locationOfTouch:0 inView:sender.view];
CGPoint touchLocationInScene = [self convertPointFromView:touchLocationInView];
Then you can detect which label node was tapped using,
for (SKLabelNode *node in self.children) {
if ([node containsPoint:touchLocationInScene]) {
//This is where I want the tap to be detected.
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With