Как изменить стиль анимации модального UIViewController?

В настоящее время я показываю UIViewController следующим образом:

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

и спрятать его следующим образом:

[self.navigationController dismissModalViewControllerAnimated:YES];

Анимация "сдвигается снизу"... затем сдвигается назад. Как изменить стиль анимации? Могу ли я заставить его исчезать/выходить?

Ура!

Ответ 1

Marcus Zarra опубликовал отличное решение для этого в списке рассылки SDK:

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];

Существуют переходы для переворота и скручивания страниц. Если вы настроены на затухание, можете попробовать настроить новый вид alpha:

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];

Однако то, что вы, вероятно, хотите, это кроссфейд или, по крайней мере, постепенное исчезновение. Когда UINavigationController переключается на новое представление, он удаляет старый. Для этого эффекта вам, вероятно, лучше просто добавить новое представление к существующему UIViewController и затухать его альфа в течение долгого времени.

Примечание. Если вы не находитесь в своем делетете приложения, [self window] не будет работать. Используйте self.view.window, благодаря сообщению user412500 для указания этого.

Ответ 2

Для iPhone 3.0+ базовое кроссфейд проще всего сделать следующим образом:

modalViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[[self navigationController] presentModalViewController:modalViewController
                                               animated:YES];

Ответ 3

Чтобы обновить альфа-затухание в 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;}];

Ответ 4

Это должно быть [self.view.window], чтобы код работал

(по крайней мере, так, как это описано в ios 3.2)