【问题标题】:Function to detect if there's any touch occurring on the screen检测屏幕是否有触摸的功能
【发布时间】:2016-07-09 11:06:37
【问题描述】:

我正在尝试创建一个类似于touchesBegan 的简单函数,用于检测屏幕上是否发生任何触摸。

因为我对 UITouch 类不满意,所以我自己尝试了一下,但我真的需要一些自制的功能,在 touchesBegan 默认功能之外。

我试图做类似“伪代码/swift”的事情

func isTouchingTheScreen() -> Bool {
   let someTouchHandleConstant: uitouch ???
   if imTouchingTheScreen {
       return true
   } else {
     return false
   }
}

你有什么提示吗?

PS:我知道代码不起作用,不要说出来,这只是为了给你一些我正在尝试做的事情的“形象”(:

【问题讨论】:

    标签: ios swift sprite-kit swift2


    【解决方案1】:

    想法

    您可以简单地跟踪用户开始、结束或取消的每一次触摸。

    class GameScene: SKScene {
    
        private var activeTouches = Set<UITouch>()
    
        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            activeTouches.unionInPlace(touches)
        }
    
        override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
            activeTouches.subtractInPlace(touches)
        }
    
        override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
            if let touches = touches {
                activeTouches.subtractInPlace(touches)
            }
        }
    
        var isTouchingTheScreen: Bool { return !activeTouches.isEmpty }
    }
    

    不断更新activeTouches

    如您所见,我一直在更新activeTouches Set。

    每次触摸开始时,我都会将其添加到activeTouches。每次触摸结束或取消时,我都会将其从activeTouches中删除。

    isTouchingTheScreen 计算变量

    这使我可以定义isTouchingTheScreen 计算属性,当Set 包含某些元素时,它只返回true。

    【讨论】:

      【解决方案2】:

      您可以如下实现UITapGestureRecognizer:

      var tapGesture :UITapGestureRecognizer!
      
      override func didMoveToNode() {
          // Add UITapGestureRecognizer to view
          self.tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.touchedView(_:)))
          view.addGestureRecognizer(tapGesture)
      }
      func touchedView(sender: UITapGestureRecognizer) {
              print("view touched")
      }
      

      【讨论】:

      • 好吧,正如我所写,我需要一个不是 touchesBegan 默认的函数。
      • 你可以添加UITapGesture来检测触摸。
      【解决方案3】:

      你可以实现UITapGestureRecognizer:

      // global var
      var tapGesture :UITapGestureRecognizer!
      
      override func didMoveToView() {
          // Add tap gesture recognizer to view
          self.tapGesture = UITapGestureRecognizer(target: self, action: #selector(GameScene.handleTap(_:)))
          self.tapGesture.cancelsTouchesInView = false
          view.addGestureRecognizer(tapGesture)
      }
      func handleTap(sender: UITapGestureRecognizer) {
              print("GameScene tap")
              if sender.state == .Ended {
                   var positionInScene: CGPoint = sender.locationInView(sender.view)
                   positionInScene = self.scene!.convertPointFromView(positionInScene)
                   let touchedNode = self.nodeAtPoint(positionInScene)
                   if touchedNode.name != "myHero" {
                       print("The SKSpriteNode myHero was tapped")
                   }
              }
      }
      

      您可以在 Apple 文档here 中找到更多详细信息。

      【讨论】:

      • 嗯...我完全不记得了。我认为这会奏效。稍后我会在实现这些功能时给你反馈:)
      猜你喜欢
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      相关资源
      最近更新 更多