UITapGestureRecognizer на SKNode: преобразование координат из UIView в SKNode
У меня есть UITapGestureRecognizer
и UIPanGestureRecognizer
на UIView
с SKScene
на нем. Распознаватель жестов pan перемещает SKNode слева направо,и я хочу, чтобы распознаватель жестов Tap обнаружил дочерний элемент SKNode, который перемещается. Панорамирование работает нормально, но у меня возникли проблемы с обнаружением отводов - жест отвода запускает соответствующий метод, но я не знаю, как преобразовать координаты из вида на сцену в узел, чтобы определить, находится ли отвод в одном из дочерних узлов.
UIView (с жестами) → SKScene → Узел панорамирования → потомки узла панорамирования
Как проверить, является ли координата касания жеста касания заданным 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);
}
}
}
}
3 ответа:
В конце концов мне нужно было сделать еще пару шагов от того, что было предложено-преобразование из SKView → SKScene, а затем в SKNode, который содержал узлы, которые я тестировал.
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];
Вы должны преобразовать координаты вида в координаты сцены с помощью
convertPointFromView:
CGPoint touchLocationInView = [sender locationOfTouch:0 inView:sender.view]; CGPoint touchLocationInScene = [self convertPointFromView:touchLocationInView];
Затем вы можете определить, какой узел метки был выбран с помощью,
for (SKLabelNode *node in self.children) { if ([node containsPoint:touchLocationInScene]) { //This is where I want the tap to be detected. } }
Я раньше не использовал SceneKit, но из документов видно, что вам нужно использовать метод SKView
convertPoint:toScene:
для преобразования координат касания распознавателя жестов из координат вида в координаты сцены. Затем вам нужно нажать проверить узлы в вашей сцене, чтобы выяснить, какой узел был прослушан.