UILongPressGestureRecognizer с помощью SpriteKit
Я пытаюсь понять, как определить, был ли нажат shapeNode, особенно с помощью жеста LongPress. Пожалуйста, посмотрите на код ниже. Любая идея, что не так, почему я не вижу "Найдено!" сообщение?
class Test: SKScene {
let longPressGesture = UILongPressGestureRecognizer()
override func didMove(to view: SKView) {
longPressGesture.addTarget(self, action: #selector(GameScene.longPress))
self.view?.addGestureRecognizer(longPressGesture)
let testPath = UIBezierPath(rect: CGRect(x: (view.scene?.frame.midX)!, y: (view.scene?.frame.midY)!, width: 2 * 50.0, height: 2 * 50.0)).cgPath
let testNode = Node.init(path: testPath, nodeName: "TEST")
testNode.fillColor = UIColor.brown
testNode.position = CGPoint(x: (view.scene?.frame.midX)!, y: (view.scene?.frame.midY)!)
self.addChild(testNode)
}
func longPress(_ sender: UILongPressGestureRecognizer) {
let longPressLocation = sender.location(in: self.view)
if sender.state == .began {
for child in self.children {
if let shapeNode = child as? SKShapeNode {
if shapeNode.contains(longPressLocation) {
print("Found!")
}
}
}
} else if sender.state == .ended {
print("ended")
}
}
}
Большое спасибо за любую помощь!
1 ответ
В настоящее время вы рассчитываете местоположение крана в системе координат вида. Для того, чтобы работать в системе координат сцены (потому что SKShapeNode
добавляется в сцену), вам нужно преобразовать местоположение касания из системы координат вида в систему координат сцены, например так:
let longPressLocation = convertPoint(fromView: sender.location(in: self.view))
Не имеет отношения к исходной проблеме, но следует иметь в виду, что принудительное развертывание не является хорошей идеей в большинстве случаев (хотя иногда это помогает на этапе разработки), и вы должны стремиться получить доступ к базовым значениям опционов в безопасном месте. путь (используя, если позволяют, например, синтаксис).