iPhone: se desvanece la transición entre dos RootViewControllers

Obj-C respuestas Obj-C o MonoTouch C# están bien.

El RootViewController de UIWindow inicial es una pantalla de inicio de session simple.

 window.RootViewController = loginScreen; 

Después de iniciar session, configuré la raíz en la aplicación principal

 window.RootViewController = theAppScreen; 

¿Cómo puedo Fade-transition entre los dos RootViewControllers en esta instancia?

Podría sugerirle un enfoque diferente que le proporcione su animation. Simplemente vaya al controller de la aplicación de theAppScreen primero , y si necesita que el usuario inicie session, haga que el presentViewController llegue a la loginScreen (no necesita animar este paso si quiere que parezca que fue directamente al inicio de session pantalla). De esta forma, cuando hayas iniciado session correctamente, loginScreen puede dismissViewControllerAnimated y tu animation volverá a la theAppScreen principal theAppScreen . (Obviamente, si desea el efecto de desvanecimiento, no olvide configurar el modalTransitionStyle del controller en UIModalTransitionStyleCrossDissolve ).

Si está rootViewController decidido a cambiar su rootViewController , la única forma en que puedo pensar en hacerlo (y no me gusta) sería hacer algo como:

 MainAppViewController *controller = [[MainAppViewController alloc] initWithNibName:@"MainAppViewController" bundle:nil]; // animate the modal presentation controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [self.window.rootViewController presentViewController:controller animated:YES completion:^{ // and then get rid of it as a modal [controller dismissViewControllerAnimated:NO completion:nil]; // and set it as your rootview controller self.window.rootViewController = controller; }]; 

La primera técnica me parece mucho más limpia.

Este es el código MT de la técnica de @Robert Ryan (aunque estoy de acuerdo con su sugerencia de que la aplicación theAppScreen is probablemente el "correcto" RootViewController ):

 void DissolveIn (UIWindow window, UIViewController newController) { newController.ModalTransitionStyle = UIModalTransitionStyle.CrossDissolve; window.RootViewController.PresentViewController (newController, true, () => { window.RootViewController.DismissViewController (false, null); window.RootViewController = newController; }); } 

Puedes hacerlo:

 window.RootViewController = theAppScreen; loginScreen.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [theAppScreen presentModalViewController:loginScreen animated:NO]; 

loginScreen puede descartarse cuando [self dismissModalViewControllerAnimated:YES];

El NO en la primera animation hará que la pantalla de inicio de session aparezca sin ninguna visibilidad de la pantalla de la aplicación debajo de ella. El animado = SÍ al finalizar proporcionará la disolución cruzada.