2016-04-02 12 views
7

Ich habe eine kreisförmige Ansicht und habe es über den folgenden Code drehen touchesBegan(touches:, withEvent:) und touchesMoved(touches:, withEvent:).Berechnen Sie die Rotationsgeschwindigkeit und natürlich drehen Sie die Ansicht iOS

var deltaAngle = CGFloat(0) 
var startTransform: CGAffineTransform? 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
{ 
    let touchPoint = touches.first!.locationInView(view) 

    let dx = touchPoint.x - view.center.x 
    let dy = touchPoint.y - view.center.y 

    deltaAngle = atan2(dy, dx) 
    startTransform = arrowPickerView.transform 
} 

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) 
{ 
    let touchPoint = touches.first!.locationInView(view) 

    let dx = touchPoint.x - view.center.x 
    let dy = touchPoint.y - view.center.y 
    let angle = atan2(dy, dx) 
    let angleDifference = deltaAngle - angle 
    let transform = CGAffineTransformRotate(startTransform!, -angleDifference) 
    arrowPickerView.transform = transform 
} 

Ich möchte touchesEnded(touches:, withEvent:) außer Kraft zu setzen, die Geschwindigkeit zu berechnen und haben den Blick natürlich ein wenig (ähnlich kontinuierliches Scrollen) drehen. Ich speichere derzeit die ursprüngliche Transformation und berechne den Delta-Winkel. Wie kann ich das umsetzen? Danke im Voraus!

+1

Die Geschwindigkeit ist die Entfernung geteilt durch die Zeit, also wenn Sie ein NSDate() .time1970 in Ihrem touchesBegan hinzufügen und in Ihrem touchEnd können Sie den Unterschied in Sekunden zwischen dem begin event und end event berechnen. Die Entfernung ist nur sqrt (dx^2 + dy^2). Oder ist das nicht die Geschwindigkeit, nach der Sie suchen? Sonst werde ich als Antwort unten nicht umschreiben :) – Emptyless

+0

Ich wollte nur kinetisch scrollen, damit es weiter scrollt. Wenn der Benutzer sagt, scrollt super schnell und dann wirklich langsam und loslassen, dann wird es weiter mit einer Geschwindigkeit schneller als die letzte, die es rotiert drehte. Ich lege einen Schwerpunkt auf Geschwindigkeit in der Frage, aber es dreht sich alles um kinetisches Scrollen –

Antwort

2

In meinem Beispiel unten hängt die CGAffineTransformRotate auf:

  • Richtung (wenn der Benutzer bewegt sich von links nach rechts, nach oben oder unten etc.)
  • Rotation (Faktor abhängig von der Zeit zwischen touchesBegan und touchesEnded)
  • PI

Dies schafft eine CGAffineTransformRotate und diese dreht sich mit der Dauer 1 (s), um ein Gefühl der kinetischen den UIViewAnimationOpt Scrollen zu erstellen ions.CurveEaseOut Eigenschaft wird

verwendet
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    let touchPointEnd = touches.first!.locationInView(view) 

    self.dateTouchesEnded = NSDate() 

    let delay : NSTimeInterval = NSTimeInterval(0) 

    let timeDelta : Double = self.dateTouchesEnded!.timeIntervalSince1970 - self.dateTouchesStarted!.timeIntervalSince1970 

    let horizontalDistance : Double = Double(touchPointEnd.x - self.touchPointStart!.x) 
    let verticalDistance : Double = Double(touchPointEnd.y - self.touchPointStart!.y) 

    var direction : Double = 1 
    if (fabs(horizontalDistance) > fabs(verticalDistance)) { 
     if horizontalDistance > 0 { 
      direction = -1 
     } 
    } else { 
     if verticalDistance < 0 { 
      direction = -1 
     } 
    } 

    let rotation : Double = (0.1/timeDelta < 0.99) ? 0.1/timeDelta : 0.99 

    let duration : NSTimeInterval = NSTimeInterval(1) 
    UIView.animateWithDuration(duration, delay: delay, options: UIViewAnimationOptions.CurveEaseOut, animations: { 
     let transform = CGAffineTransformRotate(self.imageView.transform, CGFloat(direction) * CGFloat(rotation) * CGFloat(M_PI)) 
     self.imageView.transform = transform 
     }, completion: nil) 

} 

ich die Variablen hinzugefügt Spur der Start- und Endzeit der Berührungen zu halten und fügte den CGPoint Standort der touchesBegan Funktion

var dateTouchesStarted : NSDate? 
var dateTouchesEnded : NSDate? 
var touchPointStart : CGPoint? 

In touchesBegan i hinzugefügt:

self.touchPointStart = touchPoint 

So legen Sie die Variable wie oben beschrieben fest.

+1

Ich musste es zwicken, um es für meine Situation zu arbeiten, aber danke! Du bekommst das Kopfgeld! –