EDITAR: Nueva respuesta que funciona en cualquier orientación.
La respuesta original solo funciona cuando la interfaz está en orientación vertical. Estas son animaciones de transición de vista b / c que reemplazan una vista con una vista diferente que debe ocurrir con vistas al menos un nivel por debajo de la primera vista agregada a la ventana (por ejemplowindow.rootViewController.view.anotherView).
He implementado una clase de contenedor simple que llamé TransitionController. Puede encontrarlo en https://gist.github.com/1394947 .
Por otro lado, prefiero la implementación en una clase separada b / c, es más fácil de reutilizar. Si no quiere eso, simplemente podría implementar la misma lógica directamente en el delegado de su aplicación eliminando la necesidad de la TransitionControllerclase. Sin embargo, la lógica que necesitarías sería la misma.
Úselo de la siguiente manera:
En su delegado de aplicaciones
// add a property for the TransitionController
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
MyViewController *vc = [[MyViewContoller alloc] init...];
self.transitionController = [[TransitionController alloc] initWithViewController:vc];
self.window.rootViewController = self.transitionController;
[self.window makeKeyAndVisible];
return YES;
}
Para pasar a un nuevo controlador de vista desde cualquier controlador de vista
- (IBAction)flipToView
{
anotherViewController *vc = [[AnotherViewController alloc] init...];
MyAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate.transitionController transitionToViewController:vc withOptions:UIViewAnimationOptionTransitionFlipFromRight];
}
EDITAR: Respuesta original a continuación: solo funciona para la orientación de retrato
Hice los siguientes supuestos para este ejemplo:
Tiene un controlador de vista asignado como el rootViewControllerde su ventana
Cuando cambia a una nueva vista, desea reemplazar el viewController actual con el viewController que posee la nueva vista. En cualquier momento, solo el viewController actual está activo (por ejemplo, asignado).
El código se puede modificar fácilmente para que funcione de manera diferente, el punto clave es la transición animada y el controlador de vista única. Asegúrese de no retener un controlador de vista en ningún lugar fuera de su asignación window.rootViewController.
Código para animar la transición en el delegado de la aplicación
- (void)transitionToViewController:(UIViewController *)viewController
withTransition:(UIViewAnimationOptions)transition
{
[UIView transitionFromView:self.window.rootViewController.view
toView:viewController.view
duration:0.65f
options:transition
completion:^(BOOL finished){
self.window.rootViewController = viewController;
}];
}
Ejemplo de uso en un controlador de vista
- (IBAction)flipToNextView
{
AnotherViewController *anotherVC = [[AnotherVC alloc] init...];
MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate transitionToViewController:anotherVC
withTransition:UIViewAnimationOptionTransitionFlipFromRight];
}