Wie kann ich den Animationsstil eines modalen UIViewControllers ändern?

69

Ich zeige derzeit einen UIViewController wie folgt an:

[[self navigationController] presentModalViewController:modalViewController animated:YES];

und verstecke es so:

[self.navigationController dismissModalViewControllerAnimated:YES];

Die Animation lautet "von unten nach oben schieben" ... und dann wieder nach unten schieben. Wie kann ich den Animationsstil ändern? Kann ich es ein- / ausblenden lassen?

Prost!

MrDatabase
quelle

Antworten:

60

Marcus Zarra hat eine großartige Lösung dafür auf der SDK-Mailingliste veröffentlicht:

UIViewController *controller = [[[MyViewController alloc] init] autorelease];
UIViewAnimationTransition trans = UIViewAnimationTransitionCurlUp;
[UIView beginAnimations: nil context: nil];
[UIView setAnimationTransition: trans forView: [self window] cache: YES];
[navController presentModalViewController: controller animated: NO];
[UIView commitAnimations];

Es gibt Übergänge zum Umblättern und Einrollen von Seiten. Wenn Sie auf Überblenden eingestellt sind, können Sie versuchen, das Alpha Ihrer neuen Ansicht anzupassen:

UIViewController *controller = [[[MyViewController alloc] init] autorelease];
controller.view.alpha = 0.0;
[navController presentModalViewController: controller animated: NO];
[UIView beginAnimations: nil context: nil];
controller.view.alpha = 1.0;
[UIView commitAnimations];

Was Sie jedoch wahrscheinlich wollen, ist eine Überblendung oder zumindest eine Überblendung. Wenn der UINavigationController zu einer neuen Ansicht wechselt, wird die alte entfernt. Für diesen Effekt ist es wahrscheinlich besser, wenn Sie Ihrem vorhandenen UIViewController eine neue Ansicht hinzufügen und dessen Alpha im Laufe der Zeit einblenden.

Hinweis: Wenn Sie sich nicht in Ihrer App befinden, funktioniert der Delegat [Selbstfenster] nicht. Verwenden Sie self.view.window, dank des Beitrags von user412500, um darauf hinzuweisen.

Ben Gottlieb
quelle
5
Das ist alt! Siehe die Antwort von Simo Salminen unten! MrDatabase Sie sollten dies wechseln
Adam Waite
194

Für das iPhone 3.0+ ist eine einfache Überblendung am einfachsten wie folgt:

modalViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[[self navigationController] presentModalViewController:modalViewController
                                               animated:YES];
Simo Salminen
quelle
2
Funktioniert perfekt!!! Es dauerte ein paar Sekunden, bis mir klar wurde, dass der Übergang auf den ViewController angewendet werden muss, der präsentiert wird, und nicht auf sich selbst.
Looneydoodle
Sie können dies im Interface Builder tun, indem Sie beispielsweise einen modalen Übergang hinzufügen und den Übergang auf festlegen Cross Dissolve.
Paulvs
8

So aktualisieren Sie das Alpha-Fading in iOS 4:

modalController.view.alpha = 0.0;
[self.view.window.rootViewController presentModalViewController:modalController animated:NO];
[UIView animateWithDuration:0.5
                 animations:^{modalController.view.alpha = 1.0;}];
Peter DeWeese
quelle
2

Es sollte sein [self.view.window], damit der Code funktioniert

(Zumindest ist das in ios 3.2 so)

user412500
quelle