UITapGestureRecognizer en SKNode: conversión de coorderadas de UIView a SKNode

Tengo un UITapGestureRecognizer y un UIPanGestureRecognizer en una UIView con un SKScene en él. El reconocedor de gestos de desplazamiento mueve un SKNodo de izquierda a derecha, y quiero que el reconocedor de gestos Tap detecte un hijo del SKNode que se mueve. El desplazamiento funciona bien, pero tengo problemas para detectar los toques: el gesto Tap dispara el método pertinente, pero no estoy seguro de cómo convertir las coorderadas de la vista a la escena para detectar si el toque está en uno de ellos. los nodos hijos

UIView (con gestos) → SKScene → Nodo de panorámica → Hijos del nodo de panorámica

¿Cómo verifico si la coorderada táctil de un gesto de toque es un SKNode dado?

 -(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); } } } 

}

Al final, necesitaba hacer un par de pasos más de lo que se sugirió: convertir del SKView → SKScene y luego al SKNode que contenía los nodos que probé.

  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]; 

Debería convertir las coorderadas de vista a las coorderadas de escena usando convertPointFromView:

 CGPoint touchLocationInView = [sender locationOfTouch:0 inView:sender.view]; CGPoint touchLocationInScene = [self convertPointFromView:touchLocationInView]; 

Entonces puede detectar qué nodo de label se utilizó,

 for (SKLabelNode *node in self.children) { if ([node containsPoint:touchLocationInScene]) { //This is where I want the tap to be detected. } } 

No he usado SceneKit anteriormente, pero de los documentos parece que necesitas usar el método convertPoint:toScene: para convertir las coorderadas de toque del reconocimiento de gestos desde las coorderadas de visualización a las coorderadas de escena. Luego, debe probar los nodos en su escena para determinar qué nodo se seleccionó.