在 Swift 中获取多个触摸的坐标

Posted

技术标签:

【中文标题】在 Swift 中获取多个触摸的坐标【英文标题】:Get coordinates of multiple touches in Swift 【发布时间】:2015-02-24 12:59:54 【问题描述】:

所以我一直在尝试获取屏幕上的触摸坐标。到目前为止,我可以通过以下方式获得一次触摸的坐标:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) 
    let touch = touches.anyObject()! as UITouch
    let location = touch.locationInView(self.view)
    println(location)

但是当用两根手指触摸时,我只能得到第一次触摸的坐标。多点触控工作(我用这个小教程进行了测试:http://www.techotopia.com/index.php/An_Example_Swift_ios_8_Touch,_Multitouch_and_Tap_Application)。所以我的问题是,如何获得第二次(以及第三次、第四次……)触摸的坐标?

【问题讨论】:

【参考方案1】:

** 更新到 Swift 4 和 Xcode 9(2017 年 10 月 8 日)**

首先,记得通过设置来启用多点触控事件

self.view.isMultipleTouchEnabled = true

在您的 UIViewController 的代码中,或在 Xcode 中使用适当的故事板选项:

否则,您将始终在touchesBegan (see documentation here) 中获得一次触摸。

然后,在touchesBegan 中,遍历触摸集以获取它们的坐标:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
    for touch in touches 
        let location = touch.location(in: self.view)
        print(location)
    

【讨论】:

感谢您的回答!我将 giorashc 的回答标记为最有帮助,因为他提供了更多信息,但两种方法都有效:) 不客气!当然,这是你的电话:)我已经稍微编辑了答案并留下了对文档的引用,强调了启用多点触控的重要性,否则代码将无法工作(我们总是忘记这一点!)。我将此答案留作可能需要该详细信息的其他人的参考:)【参考方案2】:

给定的touches 参数是一组检测到的触摸。 您只看到一次触摸,因为您选择了其中一种触摸:

touches.anyObject() // Selects a random object (touch) from the set

为了让所有的接触迭代给定的集合

for obj in touches.allObjects 
   let touch = obj as UITouch
   let location = touch.locationInView(self.view)
   println(location)

【讨论】:

【参考方案3】:

您必须迭代不同的触摸。这样您就可以访问每一次触摸。

for touch in touches
  //Handle touch
  let touchLocation = touch.locationInView(self.view)

【讨论】:

【参考方案4】:

在 Swift 1.2 中这种情况发生了变化,touchesBegan 现在提供了一组 NSObject。 要遍历它们,请将 touches 集合转换为一组 UITouch 对象,如下所示:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) 

    var touchSet = touches as! Set<UITouch>

    for touch in touchSet
        let location = touch.locationInView(self.view)
        println(location)
    

【讨论】:

我应该将此答案标记为问题的答案吗? (因为现在标记的答案不再是真正的答案)【参考方案5】:

对于 Swift 3,基于@Andrew 的回答:

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) 

    let touchSet = touches

    for touch in touchSet
        let location = touch.location(in: self.view)
        print(location)
    

编辑,我的错,这不是回答你的问题,有同样的问题,有人将我链接到this previous answer:

无论如何,我不得不更改一些东西以使其在 swift 3 中运行,这是我当前的代码:

var fingers = [String?](repeating: nil, count:5)

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
    super.touchesBegan(touches, with: event)
    for touch in touches
        let point = touch.location(in: self.view)
        for (index,finger)  in fingers.enumerated() 
            if finger == nil 
                fingers[index] = String(format: "%p", touch)
                print("finger \(index+1): x=\(point.x) , y=\(point.y)")
                break
            
        
    


override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) 
    super.touchesMoved(touches, with: event)
    for touch in touches 
        let point = touch.location(in: self.view)
        for (index,finger) in fingers.enumerated() 
            if let finger = finger, finger == String(format: "%p", touch) 
                print("finger \(index+1): x=\(point.x) , y=\(point.y)")
                break
            
        
    


override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) 
    super.touchesEnded(touches, with: event)
    for touch in touches 
        for (index,finger) in fingers.enumerated() 
            if let finger = finger, finger == String(format: "%p", touch) 
                fingers[index] = nil
                break
            
        
    

我还有一点问题,但我认为它与我的代码中的 GestureRecognizer 相关联。 但这应该可以解决问题。 它将打印您控制台中每个点的坐标。

【讨论】:

如果有人可以确认这是有效的,我会将其标记为答案【参考方案6】:

在 Swift 3,4 中 通过哈希值识别触摸指针:

// SmallDraw
func pointerHashFromTouch(_ touch:UITouch) -> Int 
    return Unmanaged.passUnretained(touch).toOpaque().hashValue
 

【讨论】:

以上是关于在 Swift 中获取多个触摸的坐标的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Swift 中的 valueChanged 事件中获取触摸坐标

如何在iOS swift中获取点击点(坐标)

通过多个 UIView 注册触摸

Swift 5:如何在点击/触摸坐标时在 GoogleMap 上添加标记?

如何在 Swift 3 中多点触摸 UICollectionViewCell

使用 spritekit 检测释放滑动 swift 时的坐标 [关闭]