2011-01-28 12 views
30

Qualche idea se esiste un modo per ottenere la durata di un gesto o dei tocchi di scorrimento in modo da poter calcolare la distanza?UISwipeGestureRecognizer Lunghezza del tratto

+0

Penso che si può solo prendere la direzione fr om UISwipeGestureRecognizer. Forse puoi ottenere la posizione dove inizia il tocco e dove finisce e calcolare la lunghezza da quello. – picknick

risposta

53

È impossibile ottenere una distanza da un gesto di scorrimento, perché SwipeGesture attiva il metodo in cui è possibile accedere alla posizione esattamente una volta, al termine del gesto.
Forse si desidera utilizzare un UIPanGestureRecognizer.

Se è possibile utilizzare il gesto di panoramica, si salverà il punto iniziale della panoramica e, se la panoramica è terminata, calcolare la distanza.

- (void)panGesture:(UIPanGestureRecognizer *)sender { 
    if (sender.state == UIGestureRecognizerStateBegan) { 
     startLocation = [sender locationInView:self.view]; 
    } 
    else if (sender.state == UIGestureRecognizerStateEnded) { 
     CGPoint stopLocation = [sender locationInView:self.view]; 
     CGFloat dx = stopLocation.x - startLocation.x; 
     CGFloat dy = stopLocation.y - startLocation.y; 
     CGFloat distance = sqrt(dx*dx + dy*dy); 
     NSLog(@"Distance: %f", distance); 
    } 
} 
+1

Grazie mille per l'idea! – Tomo

+0

dovrebbe 'sqrt' essere' sqrtf'? – ZeR0

+9

Se si utilizza un UIPanGestureRecognizer, il metodo incorporato - (CGPoint) translationInView: (vista UIView *) funziona molto bene. – Jon

2

È possibile farlo solo in un modo standard: ricordare il punto di tocco del touchBin e confrontare il punto da touchEnd.

2

Per quelli di noi utilizzando Xamarin:

void panGesture(UIPanGestureRecognizer gestureRecognizer) { 
    if (gestureRecognizer.State == UIGestureRecognizerState.Began) { 
     startLocation = gestureRecognizer.TranslationInView (view) 
    } else if (gestureRecognizer.State == UIGestureRecognizerState.Ended) { 
     PointF stopLocation = gestureRecognizer.TranslationInView (view); 
     float dX = stopLocation.X - startLocation.X; 
     float dY = stopLocation.Y - startLocation.Y; 
     float distance = Math.Sqrt(dX * dX + dY * dY); 
     System.Console.WriteLine("Distance: {0}", distance); 
    } 
} 
13

In Swift

override func viewDidLoad() { 
    super.viewDidLoad() 

    // add your pan recognizer to your desired view 
    let panRecognizer = UIPanGestureRecognizer(target: self, action: Selector("panedView:")) 
    self.view.addGestureRecognizer(panRecognizer) 

} 

func panedView(sender:UIPanGestureRecognizer){ 
    if (sender.state == UIGestureRecognizerState.Began) { 
     startLocation = sender.locationInView(self.view); 
    } 
    else if (sender.state == UIGestureRecognizerState.Ended) { 
     let stopLocation = sender.locationInView(self.view); 
     let dx = stopLocation.x - startLocation.x; 
     let dy = stopLocation.y - startLocation.y; 
     let distance = sqrt(dx*dx + dy*dy); 
     NSLog("Distance: %f", distance); 

     if distance > 400 { 
      //do what you want to do 

     } 

    } 

} 

Speranza che aiuta tutto quello che pionieri Swift

0
func swipeAction(gesture: UIPanGestureRecognizer) { 
    let transition = sqrt(pow(gesture.translation(in: view).x, 2) 
        + pow(gesture.translation(in: view).y, 2)) 
} 
+3

Nota: le risposte al solo codice sono sconsigliate. Per favore aggiungi un po 'di spiegazione. – GhostCat

Problemi correlati