在 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 事件中获取触摸坐标
Swift 5:如何在点击/触摸坐标时在 GoogleMap 上添加标记?