EDIT: Nova resposta que funciona em qualquer orientação.
A resposta original funciona apenas quando a interface está na orientação retrato. São animações de transição de vista b / c que substituem uma vista por uma vista diferente, devem ocorrer com vistas pelo menos um nível abaixo da primeira vista adicionada à janela (por exemplowindow.rootViewController.view.anotherView
).
Eu implementei uma classe simples de contêiner que chamei TransitionController
. Você pode encontrá-lo em https://gist.github.com/1394947 .
Como um aparte, prefiro a implementação em uma classe separada porque é mais fácil reutilizar. Se você não quiser isso, basta implementar a mesma lógica diretamente no delegado do aplicativo, eliminando a necessidade da TransitionController
classe. A lógica que você precisaria seria a mesma, no entanto.
Use-o da seguinte maneira:
No delegado do seu aplicativo
// 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 fazer a transição para um novo controlador de exibição de qualquer controlador de exibição
- (IBAction)flipToView
{
anotherViewController *vc = [[AnotherViewController alloc] init...];
MyAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate.transitionController transitionToViewController:vc withOptions:UIViewAnimationOptionTransitionFlipFromRight];
}
EDIT: resposta original abaixo - só funciona para orientação portait
Fiz as seguintes suposições para este exemplo:
Você tem um controlador de exibição atribuído como rootViewController
da sua janela
Quando você alterna para uma nova visualização, deseja substituir o viewController atual pelo viewController que possui a nova visualização. A qualquer momento, apenas o viewController atual está ativo (por exemplo, alocado).
O código pode ser facilmente modificado para funcionar de maneira diferente, o ponto principal é a transição animada e o controlador de visualização única. Certifique-se de não manter um controlador de exibição em nenhum lugar fora da atribuição a ele window.rootViewController
.
Código para animar a transição no delegado do aplicativo
- (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;
}];
}
Exemplo de uso em um controlador de exibição
- (IBAction)flipToNextView
{
AnotherViewController *anotherVC = [[AnotherVC alloc] init...];
MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate transitionToViewController:anotherVC
withTransition:UIViewAnimationOptionTransitionFlipFromRight];
}