web-dev-qa-db-fra.com

UISwipeGestureRecognizer Longueur de balayage

Avez-vous une idée s’il existe un moyen d’obtenir la longueur d’un geste de balayage ou le toucher afin que je puisse calculer la distance?

35
Tomo

Il est impossible d'éloigner un geste d'un geste, car SwipeGesture déclenche la méthode permettant d'accéder à l'emplacement exactement une fois, à la fin du geste.
Peut-être souhaitez-vous utiliser un UIPanGestureRecognizer.

Si vous pouvez utiliser le geste panoramique, vous sauvegarderez le point de départ du panoramique et, si celui-ci est terminé, calculez la distance. 

- (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);
    }
}
55
Matthias Bauch

En rapide

 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)

}

   @objc func panedView(sender:UIPanGestureRecognizer){
        var startLocation = CGPoint()
        if (sender.state == UIGestureRecognizerState.began) {
            startLocation = sender.location(in: self.view)
        }
        else if (sender.state == UIGestureRecognizerState.ended) {
            let stopLocation = sender.location(in: 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
        }
    }
}

Espérons que cela aide tous les pionniers rapides

15
ColossalChris

Pour ceux qui utilisent 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);
    }
}
3
IceWarrior353

Vous ne pouvez le faire que de manière standard: rappelez-vous le point de contact de touchBegin et comparez le point de touchEnd.

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

J'ai une implémentation similaire à la réponse dans Swift qui fait la distinction entre un glissement et un glissement en calculant la distance par rapport au conteneur et la vitesse du glissement.

@objc private func handleSwipe(sender: UIPanGestureRecognizer) {
    if (sender.state == .began) {
        self.swipeStart.location = sender.location(in: self)
        self.swipeStart.time = Date()
    }
    else if (sender.state == .ended) {
        let swipeStopLocation : CGPoint = sender.location(in: self)
        let dx : CGFloat = swipeStopLocation.x - swipeStart.location.x
        let dy : CGFloat = swipeStopLocation.y - swipeStart.location.y
        let distance : CGFloat = sqrt(dx*dx + dy*dy );
        let speed : CGFloat = distance / CGFloat(Date().timeIntervalSince(self.swipeStart.time))
        let portraitWidth = min(self.frame.size.width, self.frame.size.height)
        print("Distance: \(distance), speed: \(speed), dy: \(dy), dx: \(dx), portraitWidth: \(portraitWidth), c1: \(distance >  portraitWidth * 0.4), c2: \(abs(dy) < abs(dx) * 0.25), c3: \(speed > portraitWidth * 3.0) ")
        if distance >  portraitWidth * 0.4 && abs(dy) < abs(dx) * 0.25 && speed > portraitWidth * 3.0 {
            if dx > 0 {
                delegate?.previousAssetPressed(self)
            }else{
                delegate?.nextAssetPressed(self)
            }
        }
    }
}
0