2010-10-29 4 views
1

J'ai un UIView qui peut être déplacé avec le doigt que j'ai implémenté en utilisant un UIPanGestureRecognizer. Cela me permet de faire glisser une vue horizontalement; gauche ou droite.Comment faire glisser un UIView décélérant?

Je fais mon point de vue en mouvement tout en recevant l'état suivant de la UIPanGestureRecognizer (en utilisant la translationInView: méthode):

  • UIGestureRecognizerStateBegan
  • UIGestureRecognizerStateChanged

Qu'est-ce qui se passe pour l'instant, est la vue cesse de bouger dès que le doigt quitte la surface de l'écran, ce qui rend un effet non naturel. Ce que je voudrais, ce serait que la vue traînante décélère à partir de l'état UIGestureRecognizerStateEnded en s'arrêtant doucement.

Un tel comportement est utilisé par la classe et les sous-classes UIScrollView (UIWebView, UITableView, etc.). J'ai essayé plusieurs approches en calculant à partir de la vitesse, le moment où le toucher s'est produit et arrêté une distance d'arrêt, etc. Mais honnêtement, j'ai le sentiment d'aller nulle part pour avoir un comportement naturel. J'ai même essayé d'utiliser un moteur de physique comme Chipmunk. Mais je trouve cela compliqué pour ce que j'essaie d'accomplir, et je suis sûr qu'il devrait y avoir une meilleure solution (si ce n'est plus facile).

Merci beaucoup!

Jérémy

+0

Avez-vous expérimenté avec UIScrollView decelarationRate? – westsider

+0

Je n'utilise pas du tout UIScrollView, ni une sous-classe. Je veux juste mettre en place un mécanisme de décélération. – jchatard

+0

Comment avez-vous résolu cela? – nico

Répondre

1

Dans votre reconnaissance de geste, faire en sorte que lorsque votre doigt quitte l'écran, vous commencez une animation de continuer à faire défiler un peu, pour une courte durée, avec une transition « Décélération ».

Peut-être quelque chose comme:

[UIView beginAnimations:@"FingerOff" context:nil]; 
[UIView setAnimationDuration:0.25f]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationCurve:UIAnimationViewEaseOut]; 
[myView setFrame:newFrame]; 
[UIView commitAnimation]; 

Vous pouvez setFrame substituer à quelque chose d'autre - ce qui établit la façon dont vous voulez faire défiler ou vue - peut-être même un setCenter. Faites un peu défiler un peu plus loin que la position actuelle.

+0

Je jetterai un coup d'oeil à votre code et je reviendrai vers vous. – jchatard

+0

J'ai juste essayé, et je pense que je dois encore estimer la base de la distance d'arrêt sur la vélocité du geste. Parce que le mouvement ne semble pas naturel autrement. – jchatard

+0

Oui - vous aurez besoin de modifier à la fois le temps d'animation et le "newFrame" pour le corriger. – Brad

Questions connexes