2016-02-12 27 views
4

当我打电话touchesBegan()touchesEnded不被认可

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     print("TOUCH_BEGAN") 
} 

我得到的打印语句。 我注意到的是,如果我不动的接触点,

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 

     print("TOUCH_ENDED") 
} 

不会被调用,但是当我移动的接触点。需要拨打touchesEnded()需要一些最低限度的运动吗?如果是这样,是否有覆盖这个方法,以确保touchesEnded()总是被称为?


完整的代码太长增加,但略偏下方:

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

你不应该自己调用touchesBegan()。 – TechBee

+0

@TechBee我不明白你的意思? touchesBegan(),touchesMoved()和touchesEnded()等方法都可以称为 –

+0

这些是调用委托方法。将它们视为回调方法。你想不要打电话给他们。 – TechBee

回答

6

不能保证touchesEnded被调用,因为touchesCancelled可能会改为调用。您应始终在两者中实现结束功能。

+0

谢谢。你能举一个例子说明你的意思是“结束功能吗?” –

+0

不要紧,我得到它...只需将相同的代码复制到touchesCancelled()和touchesEnded()。这是一个壮观的提示。 –