2016-04-02 15 views
7

Mam widok w kształcie koła i obracam go za pomocą następującego nadpisania kodu: touchesBegan(touches:, withEvent:) i touchesMoved(touches:, withEvent:).Obliczanie prędkości obrotowej i widok naturalnie obracanego 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 
} 

Chcę zastąpić touchesEnded(touches:, withEvent:) obliczyć prędkość i mają widok naturalnie obracać trochę (podobny do ciągłego przewijania). Aktualnie zapisuję oryginalną transformację i obliczam kąt delta. Jak mogę to wdrożyć? Z góry dziękuję!

+1

Prędkość jest odległością podzieloną przez czas, więc jeśli dodasz NSDate(). Timesince1970 w swoich dotknięciach Began i w swoich touchach, możesz obliczyć różnicę w sekundach między początkiem a końcowym zdarzeniem. Odległość to tylko sqrt (dx^2 + dy^2). Czy nie jest to prędkość, której szukasz? Inna źle przepisana odpowiedź poniżej :) – Emptyless

+0

Szukałem tylko obsługi przewijania kinetycznego, aby kontynuować przewijanie. Jeśli użytkownik powie, że przewija się bardzo szybko, a potem naprawdę wolno i puszcza, to obraca się z prędkością większą niż ta, w której się obracał. Położyłem nacisk na prędkość w pytaniu, ale chodzi przede wszystkim o przewijanie kinetyczne. –

Odpowiedz

2

W moim przykładzie poniżej, CGAffineTransformRotate zależy od:

  • kierunku (jeśli ruchów użytkownika od lewej do prawej, w górę lub w dół, etc)
  • obrotu (współczynnik zależny od czasu pomiędzy touchesBegan i touchesEnded)
  • PI

stwarza to CGAffineTransformRotate a ten obraca się wraz z czasem trwania 1 (s), aby stworzyć atmosferę kinetycznego przewijania UIViewAnimationOpt Nieruchomość ions.CurveEaseOut służy

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) 

} 

I dodaje zmienne do śledzenia czasu początkowego i końcowego akcenty i dodać lokalizację CGPoint funkcji touchesBegan

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

W touchesBegan dodałem:

self.touchPointStart = touchPoint 

Aby ustawić zmienną zgodnie z powyższym opisem.

+1

Musiałem go poprawić, aby działało w mojej sytuacji, ale dzięki! Dostajesz nagrodę! –