UISwipeGestureRecognizer Swipe length

后端 未结 6 2173
暗喜
暗喜 2020-12-01 00:53

Any idea if there is a way to get the length of a swipe gesture or the touches so that i can calculate the distance?

相关标签:
6条回答
  • 2020-12-01 01:15

    I have an implementation similar to the answer in swift that discriminates between a drag and a swipe calculating the distance relative to the container and the speed of the swipe.

    @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 讨论(0)
  • 2020-12-01 01:16

    For those of us using 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);
        }
    }
    
    0 讨论(0)
  • 2020-12-01 01:18

    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)
    
    }
    
       @objc func panedView(sender:UIPanGestureRecognizer){
            var startLocation = CGPoint()
            //UIGestureRecognizerState has been renamed to UIGestureRecognizer.State in Swift 4
            if (sender.state == UIGestureRecognizer.State.began) {
                startLocation = sender.location(in: self.view)
            }
            else if (sender.state == UIGestureRecognizer.State.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
            }
        }
    }
    

    Hope that helps all you Swift pioneers

    0 讨论(0)
  • 2020-12-01 01:24

    It's impossible to get a distance from a swipe gesture, because the SwipeGesture triggers the method where you could access the location exactly one time, when the gesture has ended.
    Maybe you want to use a UIPanGestureRecognizer.

    If it possible for you to use pan gesture you would save the starting point of the pan, and if the pan has ended calculate the 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);
        }
    }
    
    0 讨论(0)
  • 2020-12-01 01:27

    You can only do it a standard way: remember the touch point of touchBegin and compare the point from touchEnd.

    0 讨论(0)
  • 2020-12-01 01:33
    func swipeAction(gesture: UIPanGestureRecognizer) {
        let transition = sqrt(pow(gesture.translation(in: view).x, 2)
                         + pow(gesture.translation(in: view).y, 2))
    }
    
    0 讨论(0)
提交回复
热议问题