2017-01-29 1 views
1

Ich benutze PanGesture Recognizer in Swift für iOS. Innerhalb der Aktionsmethode rufe ich die Methode eines Drittanbieters auf, die Bewegungsrichtung und Geschwindigkeit annimmt. Daraus berechnet er Position des Objekts:Swift - PanGesture Recognizer - Bewegung mit Objekt - Bewegungsgeschwindigkeit

objectPos += normalize(move) * speed 

Problem ist, dass, wenn ich mit dem Finger auf ein bestimmtes Objekt setzen und mit den Fingern bewegen, Objekte nicht an der gleichen Position unter meinem Finger ist. Es beginnt sich langsamer/schneller zu bewegen. Bewegungsrichtungen sind in Ordnung. Problem ist mit Beschleunigung/Verzögerung - wenn ich mich schneller bewege, bewegen sich Objekte schneller.

In Geste Rückruf Ich habe versucht:

let move = recognizer.translation(in: self.view); 
let speed = sqrt((move.x * move.x) + (move.y * move.y)); 

und

let move = recognizer.velocity(in: self.view); 
let speed = dt * sqrt((move.x * move.x) + (move.y * move.y)); 

Normalerweise dt = 1.0/60.0. Es ist die Gesten-Callback-Aktualisierungsrate (im Code berechne ich dt manuell unter Verwendung der Differenz von CFAbsoluteTimeGetCurrent()). Ohne dies, wenn ich die Geschwindigkeit direkt zur Berechnung der Geschwindigkeit verwende, ist die Bewegung zu schnell.

Ich habe versucht, Differenz manuell durch Subtrahieren der aktuellen und letzten Position zu berechnen, aber immer noch kein Glück.

Ich habe auch versucht, "Geschwindigkeit ändern" nach aktuellen Ansicht Breite und Höhe, aber keine ot wenn gearbeitet. Ich vermisse wahrscheinlich etwas, aber weiß nicht was.

Antwort

0

Ok ... Ich habe das Problem gefunden. Bewegung des Objekts in Bildschirm normalisierte Koordinaten mit Ecken [0,0] - [1,1]. So war die Bewegung in der Y-Achse (Höhe) korrekt, aber in der X-Achse (Breite) war die Geschwindigkeit ungefähr die Hälfte.

Multiplizieren move.x mit korrektem Seitenverhältnis löste das Problem. Grundsätzlich wird die Bewegung in der X-Achse manuell vergrößert.

0

Es wäre einfacher, wenn Sie die Bewegungen des Objekts basierend auf der Beschleunigung berechnet haben, wenn der Benutzer das Objekt nicht mehr berührt.

Solange der Benutzer seinen Finger auf das Objekt hat, ist es viel einfacher, die Position des Objekts an die Position zu setzen, die Sie vom Pan-Gesten-Erkenner erhalten.

+1

Ich kann dies nicht tun, weil die 3rd-Party-Bibliothek, die ich verwende, es nicht unterstützt. –

+0

Ich stimme dieser Antwort zu, können Sie keinen Wert senden, um die Geschwindigkeit zu neutralisieren, solange der Benutzer die Berührung hat? wie Einstellung dt 1.0 statt 1.0/60.0 –

+0

welche Bibliothek Sie verwenden? – muescha

Verwandte Themen