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

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

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 {}
}

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
        }
    }
Другие вопросы по тегам