SpriteKit: agregue UIGestureRecognizer y detecte qué nodo fue interceptado.

¿En qué método agrego un UIGestureRecognizer a mi SKScene ? ¿Y cómo puedo detectar qué nodo fue interceptado? Esto no parece funcionar:

 -(id)initWithSize:(CGSize)size { if (self = [super initWithSize:size]) { ... UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)]; recognizer.direction = UISwipeGestureRecognizerDirectionUp; [[self view] addGestureRecognizer:recognizer]; } return self; } 

Agregue el UISwipeGestureRecognizer en este método:

 - (void)didMoveToView:(SKView *)view { UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)]; recognizer.direction = UISwipeGestureRecognizerDirectionUp; [[self view] addGestureRecognizer:recognizer]; } 

Y así es como se detecta qué SKNode fue SKNode :

 - (void)handleSwipe:(UISwipeGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateEnded) { CGPoint touchLocation = [sender locationInView:sender.view]; touchLocation = [self convertPointFromView:touchLocation]; SKSpriteNode *touchedNode = (SKSpriteNode *)[self nodeAtPoint:touchLocation]; NSLog(@"%@", touchedNode); } } 

Versión Swift 3 inspirada en la respuesta de SE:

 func didSceneViewPan(_ sender: UIPanGestureRecognizer) { if sender.state == .began { let touchPoint = sender.location(in: sender.view) let touchLocation = convertPoint(fromView: touchPoint) if isPointInNode(point: touchLocation, node: testNode) { print("yes, node touched!") } else { print("no bueno :(") } } } fileprivate func isPointInNode(point: CGPoint, node: SKNode) -> Bool { // Get all nodes intersecting <point> let nodes = self.nodes(at: point) // Return true on first one that matches <node> for n in nodes { if n == node { return true } } // If here, <point> not inside <node> so return false return false } 

Puede verificar si los nodos en una location incluyen un nodo que está buscando usando esto:

 nodes(at: touchLocation).contains(nodeYouAreLookingFor)