Simulate UIScrollView Deceleration

2020-02-29 07:00发布

问题:

I have an UIPanGestureRecognize which I use to change the frame of a view. Is there a way to simulate the deceleration of the UIScrollView or UITableView when the gesture's state is UIGestureRecognizerStateEnded? Here is my current code:

if (panGesture.state == UIGestureRecognizerStateEnded)
{
    [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
    self.view.frame = CGRectMake(182, 0, self.view.frame.size.width, self.view.frame.size.height);
}
                 completion:^(BOOL finished) {
                     if (finished) {
                        //Do something
                     }
                 }];
}

but this is not a smooth scroll. I would like something that decelerates until it stops to the point I've set. Thanks

回答1:

Session 223 at WWDC 2012, "Enhancing User Experience With Scroll Views", covered a method to use a scrollview's behavior and "feel" to animate the position of a different view (without the scrollview ever actually being visible to the user).

The benefit of the method shown in the session is that your deceleration would always match UIScrollView's, now and forever.

https://developer.apple.com/videos/wwdc/2012/?id=223



回答2:

You would have to come up with an algorithm of some sort to calculate where you want the view to stop at depending on the velocity of the gesture, which can be obtained like this:

CGPoint velocity = [panGesture velocityInView:panGesture.view];

From there it should just be a matter of animating your view into its calculated resting place and adding an animation to get it there. I believe UIViewAnimationOptionCurveEaseOut would be appropriate here.