ios - 如何跟踪多次触摸

标签 ios swift xcode uitouch

嘿,我有一段很好的代码,它是@Sam_M 给我的。

我试图在移动时基本上跟踪多个手指的位置。就像 Finger 1 在这里,Finger 2 在那里。因此,从现在开始,它将打印当前在 View 上的手指/触摸的数量和位置,但它不会分别跟踪两个单独的手指。我环顾了 stackoverflow 上仅有的 3 个其他问题。但是没有一个给我可以 swift 实现的好结果。

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

for touch: UITouch in event!.allTouches()! {

for (index,touch) in touches.enumerate() {
    let ptTouch = touch.locationInNode(self.view)
    print("Finger \(index+1): x=\(pTouch.x) , y=\(pTouch.y)")
 }
}

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

for touch: UITouch in event!.allTouches()! {

for (index,touch) in touches.enumerate() {
    let ptTouch = touch.locationInNode(self.view)
    print("Finger \(index+1): x=\(pTouch.x) , y=\(pTouch.y)")
  }
 }
}

最佳答案

每个手指的触摸对象在屏幕上时将保持相同,并具有相同的内存地址。通过将触摸对象的地址存储在一个数组中,然后与该数组进行比较以准确了解哪个手指在移动,您可以在多点触摸场景中跟踪单个手指。

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

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    super.touchesBegan(touches, withEvent: event)
    for touch in touches{
        let point = touch.locationInView(self.view)
        for (index,finger)  in fingers.enumerate() {
            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>, withEvent event: UIEvent?) {
    super.touchesMoved(touches, withEvent: event)
    for touch in touches {
        let point = touch.locationInView(self.view)
        for (index,finger) in fingers.enumerate() {
            if let finger = finger where finger == String(format: "%p", touch) {
                print("finger \(index+1): x=\(point.x) , y=\(point.y)")
                break
            }
        }
    }
}

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

override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
    super.touchesCancelled(touches, withEvent: event)
    guard let touches = touches else {
        return
    }
    touchesEnded(touches, withEvent: event)
}

更新为 swift 4

感谢 @Klowne

var fingers = [UITouch?](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] = 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 == 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 == touch {
                fingers[index] = nil
                break
            }
        }
    }
}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesCancelled(touches, with: event)
    guard let touches = touches else {
        return
    }
    touchesEnded(touches, with: event)
}

*根据苹果更新的文档,现在可以在多点触摸序列中保留触摸,只要它们在序列结束时被释放

关于ios - 如何跟踪多次触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39823914/

相关文章:

ios - UIDocumentInteractionController 的打开方式功能?

iphone - 使用动画修改 imageView 的宽度

xcode - C "Sleep"函数(大写 "S")在 Mac 上有什么作用?

ios - cmd 行测试因 SSL 证书错误而失败

ios - 处理 UICollectionView Cell 内 UITextFiled 的键盘返回操作

ios - iOS模拟器键盘

ios - UIButton 未注册触摸

ios - 如何使用 Swift iOS 监听 UIReturnKeyType.Next

ios - 如何知道标签是否被点击

iphone - 如何为iPhone制作部分透明的png图像按钮?