2016-10-12 2 views
0

Hey Ich versuche, einen UIGestureRecognizer, der mir ein Rad auf dem Bildschirm drehen kann bauen. Stell dir vor es wie folgt aus:iOS/Swift: Benutzerdefinierte UIGestureRecognizer, die Spin-Bewegung erkennen

enter image description here

Zwei Gesten erkannt werden müssen: das Rad drehen und spinnen sie. Ich habe es geschafft, einen UIGestureRecognizer zu bauen, der erkennt, dass man das Rad dreht oder dreht, mit anderen Worten. Ich bin auch in der Lage, einen UISwipeGestureRecognizer dem Rad hinzuzufügen, um festzustellen, ob eine Drehgeste aufgetreten ist. Allerdings möchte ich auch eine Geste erkannt werden, die wie folgt aussieht:

  1. Der Benutzer dreht das Rad über den Bildschirm Panning
  2. Nach Schwenken, noch mit dem Finger auf dem Bildschirm, klauen schnell und Entfernen der Finger auf dem Bildschirm, so dass das Rad

ich versuchte, mit

public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true }

sie spinnen würde arbeite gleichzeitig, aber ohne Erfolg. Ich glaube auch, dass das Verbinden der beiden beschriebenen GestureRecognizer nicht ausreichen würde.

Ich würde jede Hilfe zu schätzen wissen. Danke

+0

Können Sie den Code für die Rotation teilen? –

Antwort

2

Ihr Problem wird sein, dass wenn die Pfanne startet, wird es weiterhin als Pan-Geste erkannt werden, bis die Berührung endet. Was Sie also herausfinden müssen, ist die Geschwindigkeit, wenn die Pfanne endet, und wenn Sie schicker werden wollen, projizieren Sie diese Geschwindigkeit auf den senkrechten Vektor von dem Punkt relativ zur Mitte der Ansicht. Dies würde eine Trigonometrie beinhalten, die ich genau vergesse, aber in etwa so aussehen würde.

func pan(_ sender: UIPanGestureRecognizer) { 
     ... 

    if sender.state == .ended { 
     let loc = sender.location(in: sender.view) 
     let midpoint = CGPoint(x: sender.view!.bounds.width/2, y: sender.view!.bounds.height/2) 
     let v = sender.velocity(in: sender.view) 
     let p = CGPoint(x: midpoint.x - loc.x, y: midpoint.y - loc.y) 

     let angle = atan(p.y/p.x) 
     print(angle) 
     let vProjection = v.y * cos((CGFloat.pi/2 - angle)) + v.x * cos(angle) 
     print("moment: ", vProjection) 

     let torque = p.hypotenuse() * vProjection 
     wheel.rotate(with: torque) 
    } 
} 

extension CGPoint { 
    func hypotenuse() -> CGFloat { 
     return sqrt(self.x * self.x + self.y * self.y) 
    } 
} 

Ich glaube, ich habe einen Fehler in meiner Trigonometrie dort. Ich würde einige Diagramme zeichnen müssen, aber es gibt die allgemeine Idee. wheel.rotate (mit torque: CGFloat) würde eine Animation der Layer-Transformation ausführen, um sie zu drehen.

+0

Obwohl die Werte noch nicht ganz stimmen, klappt das schon ziemlich gut. Die Idee ist großartig. Vielen Dank! – Vincent

+0

würden Sie wahrscheinlich nur mit der Geschwindigkeit sogar in Ordnung sein. Ich habe die Zahlen nicht überprüft, sondern nur mit meiner begrenzten Algebra. Froh, dass es funktioniert! –

Verwandte Themen