Получение вектора из сенсорного местоположения в Swift 3

Как следует из названия, как я могу это сделать? Я могу получить первое касание, но я не знаю, как сделать последнее касание, если это жест смахивания. Со следующим кодом я получаю сообщение об ошибке: значение типа «Набор» не имеет члена «последний». Не совсем уверен, как получить позицию, когда касание отпущено.

override func touchesMoved(_ touches: Set<UITouch>, with: UIEvent?){
    let firstTouch:UITouch = touches.first! as UITouch
    let lastTouch:UITouch = touches.last! as UITouch

    let firstTouchLocation = firstTouch.location(in: self)
    let lastTouchLocation = lastTouch.location(in: self)

}

Я хочу получить местоположение первой точки и местоположение второй точки. Затем я хотел бы использовать продолжительность салфетки, размер линии и угол линии, чтобы создать импульсный вектор для использования на SKNode. Есть ли способ извлечь эту информацию с помощью UITouch? Любая помощь приветствуется. Спасибо за ваше время!

У меня также есть основные прикосновения к экрану, которые запускают функции

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch:UITouch = touches.first! as UITouch
    let touchLocation = touch.location(in: self)
    if playButton.contains(touchLocation) && proceed == true{
        playSound1()
        Ball.physicsBody?.affectedByGravity = true
        proceed = false}
    else if infoButton.contains(touchLocation) && proceed == true{
        playSound1()
        loadScene2()}
    else {}
}

person Lyres    schedule 25.10.2016    source источник
comment
Набор touches содержит местоположения всех пальцев, касающихся экрана для этого отдельного события (начало/перемещение/завершение), а не начальную и конечную позиции движения.   -  person Martin R    schedule 25.10.2016


Ответы (1)


Вы должны сохранить значения в начале касания и сравнить со значениями в конце касания, а затем выполнить вычисления там. Обратите внимание, что прикосновение может быть отменено чем-то вроде телефонного звонка, поэтому вам также нужно предвидеть это.

    class v: UIViewController {
        var startPoint: CGPoint?
        var touchTime = NSDate()
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            guard touches.count == 1 else {
                return
            }
            if let touch = touches.first {
                startPoint = touch.location(in: view)
                touchTime = NSDate()
            }
        }

        override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
            defer {
                startPoint = nil
            }
            guard touches.count == 1, let startPoint = startPoint else {
                return
            }
            if let touch = touches.first {
                let endPoint = touch.location(in: view)
                //Calculate your vector from the delta and what not here
                let direction = CGVector(dx: endPoint.x - startPoint.x, dy: endPoint.y - startPoint.y)
                let elapsedTime = touchTime.timeIntervalSinceNow
                let angle = atan2f(Float(direction.dy), Float(direction.dx))
            }
        }

        override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
            startPoint = nil
        }
    }
person Josh Homann    schedule 25.10.2016
comment
Так мне создать новый класс контроллера представления? Можете ли вы иметь несколько контроллеров представления? Или я могу использовать эти функции в своем классе меню? Я надеялся просто вычислить этот вектор в моей GameScene, а не в моем MenuScene. - person Lyres; 26.10.2016