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")
        }
    }
}

Большое спасибо за любую помощь!


person RafalK    schedule 03.07.2017    source источник
comment
Я могу ошибаться, но вы делаете view.scene?.frame, когда можете просто сделать .frame :)   -  person Fluidity    schedule 04.07.2017


Ответы (1)


В настоящее время вы вычисляете положение касания в системе координат представления. Чтобы работать в системе координат сцены (поскольку SKShapeNode добавляется к сцене), вам необходимо преобразовать местоположение касания из системы координат вида в систему координат сцены, например:

let longPressLocation = convertPoint(fromView: sender.location(in: self.view)) 

Не имеет отношения к исходной проблеме, но следует иметь в виду, что принудительная распаковка в большинстве случаев не очень хорошая идея (хотя иногда это помогает на этапе разработки), и вы должны иметь доступ к базовым значениям опций в безопасном месте. путь (используя, например, синтаксис if let).

person Whirlwind    schedule 03.07.2017
comment
тьфу, всегда принудительно разворачивать .view. Так раздражает охранять это. - person Fluidity; 04.07.2017
comment
... для этого есть причина, что, если вы переключаете сцены? принудительная развертка приведет к сбою вашего приложения - person Knight0fDragon; 04.07.2017
comment
@Whirlwind, это отлично решает мою проблему. Большое спасибо! - person RafalK; 04.07.2017