Ich präsentiere einen View Controller modal in meiner Anwendung. Ich möchte, dass der Benutzer die Ansicht mit einer Geste "wegschnippen" kann. Ich schrieb den Code dafür:Animationen funktionieren nicht richtig
- (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);
}
}
Dies zu einem UIGestureRecognizer
angeschlossen ist:
self.pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
self.pan.delegate = self;
self.pan.maximumNumberOfTouches = 1;
[self.view addGestureRecognizer:self.pan];
Doch was passiert, ist, dass der Abschluss-Block sofort ausführt. Sie werden sehen, dass sich die Ansicht nach unten bewegt (wegen dismissViewControllerAnimated
) und gleichzeitig die overlay.effect
verschwindet. Was ich jedoch möchte, ist, dass meine Animationen passieren und sich dann der View-Controller stillschweigend abwendet.
Irgendwelche Ideen, was hier schief läuft?
Was passiert mit dem Rest der Gestenbehandlung? Verschieben Sie die Ansicht, wenn der Gestenstatus geändert wird? Es ist seltsam, nur etwas zu tun, wenn die Pfanne – jrturton
beendet ist. Ich bewege es zurück auf 0, wenn die Pfanne endet. Ansonsten bewege ich den Blick nach unten, ja. – user4992124
aber dieser Code ist nicht in Ihrer Frage – jrturton