2015-02-24 7 views
6

So habe ich herum versucht, die Koordinaten der Berührungen auf dem Bildschirm zu bekommen. Bisher kann ich die Koordinaten einer Berührung mit dieser bekommen:Erhalten Sie Koordinaten von mehreren Berührungen in Swift

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

Aber wenn sie mit zwei Fingern zu berühren ich nur die Koordinaten der ersten Verbindung. Multitouch funktioniert (Ich habe mit diesem kleinen Tutorial getestet: http://www.techotopia.com/index.php/An_Example_Swift_iOS_8_Touch,_Multitouch_and_Tap_Application). Meine Frage ist also, wie bekomme ich die Koordinaten der zweiten (und dritten, vierten ...) Berührung?

Antwort

4

das angegebene touches Argument ist eine Reihe von erkannten Berührungen. Sie sehen nur eine Berührung, weil Sie eine der Berührungen wählen mit:

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

Um alle berührt iterieren die gegeben zu bekommen gesetzt

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

Sie müssen über die verschiedenen Berührungen iterieren. Auf diese Weise können Sie auf jede Berührung zugreifen.

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

** Aktualisiert Swift 4 und Xcode 9 (8 2017) Oct **

Zunächst einmal erinnern Ereignisse Multi-Touch zu ermöglichen von

self.view.isMultipleTouchEnabled = true 
Einstellung

in Ihrem UIViewController ‚s-Code oder die entsprechende Option in Storyboard mit Xcode:

xcode screenshot

Sonst werden Sie immer einen einzigen Tastendruck bekommen in touchesBegan (see documentation here).

Dann innen touchesBegan iterieren über den Satz von Berührungen ihre Koordinaten zu erhalten:

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

Dank für Ihre Antwort danken! Ich habe Giorashcs Antwort als sehr hilfreich markiert, weil er etwas mehr Informationen gegeben hat, aber beide Methoden funktionieren :) – Fr4nc3sc0NL

+0

Gern geschehen! Es ist natürlich Ihr Anruf :) Ich habe die Antwort ein wenig bearbeitet und Referenzen zu der Dokumentation hinterlassen, die unterstrichen haben, wie wichtig es ist, Multitouch zu aktivieren oder der Code wird nicht funktionieren (das vergessen wir immer!). Ich lasse diese Antwort als eine Referenz für andere Leute, die dieses Detail brauchen könnten :) – Para

1

In Swift 1.2 hat sich dies geändert, und touchesBegan bietet nun eine Reihe von NSObjects. durch sie durchlaufen, warf den Noten Sammlung als eine Reihe von UITouch Objekte wie folgt:

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

Sollte ich diese Antwort als Antwort auf die Frage markieren? (Da die jetzt markierte Antwort nicht wirklich eine Antwort mehr ist) – Fr4nc3sc0NL

0

Für Swift 3, basierend auf @ Andrew Antwort:

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

EDIT, mein schlecht, das ist nicht Ihre Frage zu beantworten, hatte das gleiche Problem und jemand verknüpfen mich this previous answer:

Wie auch immer, ich einige Dinge zu ändern, hatte es in schnellen 3 arbeitet zu machen, hier ist mein aktueller Code:

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

Ich habe immer noch ein kleines Problem, aber ich denke, es ist mit meinem GestureRecognizer in meinem Code verknüpft. Aber das sollte den Trick tun. Es wird Ihnen die Koordinate jedes Punktes in Ihrer Konsole ausdrucken.

+0

Wenn jemand bestätigen kann, dass das funktioniert, werde ich dies als Antwort markieren – Fr4nc3sc0NL

+0

@ Fr4nc3sc0NL Bearbeitete meine Antwort, um es richtig zu machen. – Hawkydoky

0

In Swift 3,4 Identifizieren Touch Pointer durch seine hash:

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