Je présente un contrôleur de vue de manière modale dans mon application. Je voudrais que l'utilisateur puisse "balayer" la vue d'un geste. J'ai écrit le code ci-dessous pour que:Les animations ne fonctionnent pas correctement
- (void)handlePan:(UIPanGestureRecognizer *)recognizer {
CGFloat elasticThreshold = 100;
CGFloat dismissThreshold = 200;
CGPoint translation = [recognizer translationInView:self.view];
CGFloat newY = 0;
CGFloat translationFactor = 0.5;
if (recognizer.state == UIGestureRecognizerStateEnded) {
if (translation.y < dismissThreshold) {
newY = 0;
}
} else {
if (translation.y > elasticThreshold) {
CGFloat frictionLength = translation.y - elasticThreshold;
CGFloat frictionTranslation = 30 * atan(frictionLength/120) + frictionLength/10;
newY = frictionTranslation + (elasticThreshold * translationFactor);
} else {
newY = translation.y*translationFactor;
}
}
if (translation.y > dismissThreshold) {
[UIView animateKeyframesWithDuration:0.5 delay:0.0 options:0 animations:^{
[UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.5 animations:^{
self.overlay.effect = nil;
self.collectionView.transform = CGAffineTransformMakeTranslation(0, self.view.frame.size.height);
}];
[UIView addKeyframeWithRelativeStartTime:0.1 relativeDuration:0.1 animations:^{
self.pageControl.frame = CGRectMake((self.view.frame.size.width-200)/2, self.view.frame.size.height, 200, 20);
}];
} completion:^(BOOL finished) {
if (finished) {
[self dismissViewControllerAnimated:YES completion:nil];
}
}];
} else {
self.collectionView.transform = CGAffineTransformMakeTranslation(0, newY);
self.pageControl.transform = CGAffineTransformMakeTranslation(0, (newY+self.collectionView.frame.size.height)-20);
}
}
Ceci est relié à un UIGestureRecognizer
:
self.pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
self.pan.delegate = self;
self.pan.maximumNumberOfTouches = 1;
[self.view addGestureRecognizer:self.pan];
Cependant, ce qui se passe est que le bloc d'achèvement exécute immédiatement. Donc, vous verrez la vue descendre (à cause de dismissViewControllerAnimated
) et en même temps voir le overlay.effect
s'en aller. Cependant, ce que je voudrais, c'est que mes animations se produisent, puis que le contrôleur de vue se retire en silence.
Des idées sur ce qui ne va pas ici?
Que se passe-t-il avec le reste de la manipulation des gestes? Déplacez-vous la vue lorsque l'état du geste est modifié? Il semble étrange de ne rien faire quand le panoramique est terminé – jrturton
Je le ramène à 0 quand le panoramique se termine. Sinon, je déplace la vue, oui. – user4992124
mais ce code n'est pas dans votre question – jrturton