Reputation: 5154
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);
}
}
}
}
Upvotes: 7
Views: 1417
Reputation: 5154
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];
Upvotes: 9
Reputation: 131398
I haven't used SceneKit before, but from the docs it looks like you need to use the SKView method convertPoint:toScene:
to convert the gesture recognizer's tap coordinates from view coordinates to scene coordinates. You then need to hit test the nodes in your scene to figure out which node was tapped.
Upvotes: 3
Reputation: 24572
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.
}
}
Upvotes: 6