2015-02-24 13 views
6

Tak więc próbowałem uzyskać współrzędne dotykowe na ekranie. Do tej pory można uzyskać współrzędne jednym kontakcie z tym:Uzyskaj współrzędne wielu dotknięć w Swift

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

Ale gdy dotykając dwoma palcami mogę tylko współrzędne pierwszego dotyku. Multi-touch działa (testowałem z tym małym samouczkiem: http://www.techotopia.com/index.php/An_Example_Swift_iOS_8_Touch,_Multitouch_and_Tap_Application). Moje pytanie brzmi: jak uzyskać współrzędne drugiego (i trzeciego, czwartego ...) dotyku?

Odpowiedz

4

dany touches argument jest zestaw wykrytych elementami. Widzisz tylko jeden dotyk, ponieważ wybrać jedną z akcentami z:

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

Aby uzyskać wszystkie detale iteracyjne dany zestaw

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

Musisz powtórzyć różne czynności. W ten sposób uzyskasz dostęp do każdego dotyku.

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

** zaktualizowana Swift Xcode 4 i 9 (8 październik 2017) **

Przede wszystkim należy pamiętać, aby umożliwić zdarzeń multi-touch ustawiając

self.view.isMultipleTouchEnabled = true 

w twojej UIViewController „s kod, lub korzystając z odpowiedniej opcji storyboard w Xcode:

xcode screenshot

inaczej będziesz zawsze pojedynczy akcent w touchesBegan (see documentation here).

Następnie wewnątrz touchesBegan, iteracyjne nad zestawem dotknięć, aby uzyskać ich współrzędne:

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

Dziękuję za odpowiedź! Oceniłem odpowiedź giorashca jako najbardziej pomocną, ponieważ podał nieco więcej informacji, ale obie metody działają :) – Fr4nc3sc0NL

+0

Nie ma za co! To oczywiście twoja rozmowa :) Trochę zmieniłem odpowiedź i pozostawiłem odniesienia do dokumentacji, podkreślając, jak ważne jest włączenie multi-touch lub kod nie zadziała (zawsze o tym zapominamy!). Pozostawiam tę odpowiedź jako odniesienie dla innych osób, które mogą potrzebować tego szczegółu :) – Para

1

w Swift 1.2 to się zmieniło, a touchesBegan teraz zapewnia zestaw NSObjects. iterację nimi rzucać kolekcję akcenty jako zbiór UITouch obiektów następująco:

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

Czy powinienem zaznaczyć tę odpowiedź jako odpowiedź na pytanie? (Ponieważ teraz zaznaczona odpowiedź już nie jest odpowiedzią) – Fr4nc3sc0NL

0

Dla Swift 3, na podstawie @ Andrzeja odpowiedź:

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, mój zły, że nie jest odpowiadając na pytanie, miałem ten sam problem i ktoś powiązany mi this previous answer:

Zresztą musiałem zmienić kilka rzeczy, aby to działa w szybkim 3, tutaj jest mój bieżący kod:

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

Nadal mam mały problem, ale myślę, że jest on powiązany z moim GestureRecognizer w moim kodzie. Ale to powinno wystarczyć. Wyświetli współrzędne każdego punktu w twojej konsoli.

+0

Jeśli ktoś może potwierdzić, że to działa, zaznaczę to jako odpowiedź – Fr4nc3sc0NL

+0

@ Fr4nc3sc0NL Zmieniono moją odpowiedź, aby była poprawna. – Hawkydoky

0

w Swift 3,4 Identyfikowanie dotykowy wskaźnik jego hash:

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