7
votes

Obtenez des coordonnées de multiples touches à Swift

Alors j'ai été en train de jouer en essayant d'obtenir les coordonnées des touches à l'écran. Jusqu'à présent, je peux obtenir les coordonnées d'une touche avec ceci: xxx

mais lorsque vous touchez deux doigts, je reçois uniquement les coordonnées de la première touche. Works multi-touchs (j'ai testé avec ce petit tutoriel: http://www.techotopia.com /index.php/an_example_swift_ios_8_touch,_multitouch_and_tap_application ). Donc, ma question est de savoir comment puis-je obtenir les coordonnées du deuxième (et troisième, quatrième ...) toucher?


0 commentaires

6 Réponses :


1
votes

Vous devez parcourir les différentes touches. De cette façon, vous pouvez accéder à chaque touche.

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


0 commentaires

4
votes

L'argument code> indiqué est un ensemble de touches détectées. Vous ne voyez qu'une seule touche, car vous sélectionnez l'une des touches avec: xxx pré>

afin d'obtenir toutes les touches itérer l'ensemble donné P>

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


0 commentaires

15
votes

** Mis à jour sur Swift 4 et Xcode 9 (8 oct. 2017) **

Tout d'abord, N'oubliez pas d'activer les événements multi-touchs forts> en réglant P>

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


2 commentaires

Merci pour votre réponse! J'ai marqué la réponse de Giorashc aussi utile car il a donné un peu plus d'informations, mais les deux méthodes fonctionnent :)


De rien! C'est votre appel, bien sûr :) J'ai édité la réponse un peu et laissé des références à la documentation, soulignant comment il est important d'activer la multi-touch ou que le code ne fonctionnera pas (nous oublions toujours cela!). Je quitte cette réponse comme référence pour d'autres personnes qui pourraient avoir besoin de ce détail :)



1
votes

dans SWIFT 1.2 Ceci a changé et touchesbegan code> fournit désormais un ensemble de nsObjects. Itérer à travers eux, jetez la collection Touchs en tant qu'ensemble d'objets UITOUCH comme suit:

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


1 commentaires

Devrais-je marquer cette réponse comme réponse à la question? (Depuis que la réponse maintenant marquée n'est plus une réponse)



0
votes

Pour Swift 3, basé sur la réponse de @ Andrew: xxx pré>

éditer, mon mauvais, qui ne répond pas à votre question, n'avait pas le même problème et que quelqu'un m'a lié à Cette réponse précédente : p>

Quoi qu'il en soit, je devais changer de peu de choses à Fonctionnez-vous dans SWIFT 3, voici mon code actuel: P>

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


1 commentaires

Si quelqu'un peut confirmer que cela fonctionne, je vais marquer cela comme réponse



0
votes

à Swift 3,4 Identifier le pointeur tactile par son hachage: xxx


0 commentaires