when I call touchesBegan() with
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        print("TOUCH_BEGAN")
}
I get the print statement. I've noticed though that if I don't move the point of contact,
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        print("TOUCH_ENDED")
}
isn't being called but is when I move the point of contact.  Is there some minimum movement needed to call touchesEnded()?  If so, is there a way of overriding this, to ensure touchesEnded() is always called? 
The full code is too long to add but a bit more below:
import SpriteKit
import UIKit
import Foundation
class GameScene: SKScene, SKPhysicsContactDelegate {
    // MARK: Properties
    var touchStart: CGPoint?
    let minSwipeDistance:CGFloat = 22
    var distance: CGFloat = 0
    override func didMoveToView(view: SKView) {
        super.didMoveToView(view)
        //...
        // MARK: INCLUDE SWIPE GESTURES
        let swipeRight: UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedRight:"))
        swipeRight.direction = .Right
        swipeRight.cancelsTouchesInView = false
        swipeRight.delaysTouchesEnded = false
        view.addGestureRecognizer(swipeRight)
        let swipeLeft: UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedLeft:"))
        swipeLeft.direction = .Left
        swipeLeft.cancelsTouchesInView = false
        swipeLeft.delaysTouchesEnded = false
        view.addGestureRecognizer(swipeLeft)
        let swipeUp: UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedUp:"))
        swipeUp.direction = .Up
        swipeUp.cancelsTouchesInView = false
        swipeUp.delaysTouchesEnded = false
        view.addGestureRecognizer(swipeUp)
        let swipeDown: UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedDown:"))
        swipeDown.direction = .Down
        swipeDown.cancelsTouchesInView = false
        swipeDown.delaysTouchesEnded = false
        view.addGestureRecognizer(swipeDown)
    }
    // MARK: ******* User Interaction ******
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        if let touch = touches.first {
            touchStart = touch.locationInNode(self)
            let location = touch.locationInNode(self)
            let node = nodeAtPoint(location)
        }
    }
    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    }
    override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {    
    }
    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        if let touch = touches.first, start = touchStart {
            let location = touch.locationInNode(self)
            // Compute the distance between the two touches
            let dx = location.x - start.x
            let dy = location.y - start.y
            distance = sqrt(dx*dx + dy*dy)
            if distance < minSwipeDistance {
                let node = nodeAtPoint(location)
                print("NODE NAME: \(node.name)")
            }
        }
        // Reset the initial location
        touchStart = nil
    }
    // MARK: handle swipes
    func swipedRight(sender: UISwipeGestureRecognizer) {
        print("swiped right")
    }
    func swipedLeft(sender: UISwipeGestureRecognizer) {
        print("swiped left")
    }
    func swipedUp(sender: UISwipeGestureRecognizer) {
        print("swiped up")
    }
    func swipedDown(sender: UISwipeGestureRecognizer) {
        print("swiped down")
    }
}
You cannot ensure touchesEnded is called, because touchesCancelled might be called instead. You should always implement ending functionality in both.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With