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

Get coordinates of multiple touches in Swift

所以我一直在弄乱试图获取屏幕上的触摸坐标。到目前为止,我可以通过这个获得一触的坐标:

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)。所以我的问题是,如何获得第二次(和第三次、第四次……)触摸的坐标?

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

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

给定的 touches 参数是一组检测到的触摸。 你只看到一次触摸,因为你 select 其中一次触摸 :

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

** 更新为 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)
    }
}

在 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)
    }
}

对于 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)
    }
}

编辑,糟糕,这没有回答你的问题,遇到了同样的问题,有人将我链接到

无论如何,我必须改变一些东西才能让它在 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 相关联。 但这应该可以解决问题。 它会在你的控制台中打印出每个点的坐标。

在Swift3,4 通过哈希识别触摸指针:

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