agregando inercia a un UIPanGestureRecognizer

Estoy intentando mover una vista secundaria a través de la pantalla que funciona, pero también quiero agregar inercia o impulso al object.
Mi código UIPanGestureRecognizer que ya tengo está a continuación.

Gracias por adelantado.

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; [self addGestureRecognizer:panGesture]; (void)handlePan:(UIPanGestureRecognizer *)recognizer { CGPoint translation = [recognizer translationInView:self.superview]; recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y); [recognizer setTranslation:CGPointMake(0, 0) inView:self.superview]; if (recognizer.state == UIGestureRecognizerStateEnded) { [self.delegate card:self.tag movedTo:self.frame.origin]; } } 

Gracias otra véz.

Eche un vistazo a RotationWheelAndDecelerationBehaviour . hay un ejemplo de cómo hacer la desaceleración tanto para el movimiento lineal como para el movimiento rotacional. Truco es ver cuál es la velocidad cuando el usuario finaliza el toque y continúa en esa dirección con una pequeña desaceleración.

Bueno, no soy un profesional, pero, revisando varias respuestas, logré crear mi propio código con el que estoy contento.

Díganme cómo mejorarlo y si hay alguna mala práctica que utilicé.

 - (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer { CGPoint translatedPoint = [recognizer translationInView:self.postViewContainer]; CGPoint velocity = [recognizer velocityInView:recognizer.view]; float bottomMargin = self.view.frame.size.height - containerViewHeight; float topMargin = self.view.frame.size.height - scrollViewHeight; if ([recognizer state] == UIGestureRecognizerStateChanged) { newYOrigin = self.postViewContainer.frame.origin.y + translatedPoint.y; if (newYOrigin <= bottomMargin && newYOrigin >= topMargin) { self.postViewContainer.center = CGPointMake(self.postViewContainer.center.x, self.postViewContainer.center.y + translatedPoint.y); } [recognizer setTranslation:CGPointMake(0, 0) inView:self.postViewContainer]; } if ([recognizer state] == UIGestureRecognizerStateEnded) { __block float newYAnimatedOrigin = self.postViewContainer.frame.origin.y + (velocity.y / 2.5); if (newYAnimatedOrigin <= bottomMargin && newYAnimatedOrigin >= topMargin) { [UIView animateWithDuration:1.2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^ { self.postViewContainer.center = CGPointMake(self.postViewContainer.center.x, self.postViewContainer.center.y + (velocity.y / 2.5)); } completion:^(BOOL finished) { [self.postViewContainer setFrame:CGRectMake(0, newYAnimatedOrigin, self.view.frame.size.width, self.view.frame.size.height - newYAnimatedOrigin)]; } ]; } else { [UIView animateWithDuration:0.6 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^ { if (newYAnimatedOrigin > bottomMargin) { self.postViewContainer.center = CGPointMake(self.postViewContainer.center.x, bottomMargin + self.postViewContainer.frame.size.height / 2); } if (newYAnimatedOrigin < topMargin) { self.postViewContainer.center = CGPointMake(self.postViewContainer.center.x, topMargin + self.postViewContainer.frame.size.height / 2); } } completion:^(BOOL finished) { if (newYAnimatedOrigin > bottomMargin) [self.postViewContainer setFrame:CGRectMake(0, bottomMargin, self.view.frame.size.width, scrollViewHeight)]; if (newYAnimatedOrigin < topMargin) [self.postViewContainer setFrame:CGRectMake(0, topMargin, self.view.frame.size.width, scrollViewHeight)]; } ]; } } 

}

He usado dos animaciones diferentes, una es la inercia pnetworkingeterminada una y otra si para cuando el usuario lanza el contenedorView con alta velocidad.

Funciona bien en iOS 7.