在 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
}
所以我一直在弄乱试图获取屏幕上的触摸坐标。到目前为止,我可以通过这个获得一触的坐标:
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
}