Embora não seja obrigatório nomear deste jeito, esta é a maneira que todos os de-
senvolvedores costumam utilizar.
Além disso, quando trabalhamos com interfaces
gráficas utilizando arquivos .xib, respeitar a convenção de nomes simplifica o có-
digo, pois o comportamento padrão do iOS é procurar o .xib que tenha o mesmo
nome da classe.
Abra o arquivo OpcoesController.xib e adicione um componente do tipo
Label no meio da tela, com o texto Opções, apenas para termos uma indicação
visual quando ele for exibido.
Agora vá ao arquivo ViewController.m, onde você irá encontrar o corpo
dos métodos que foram conectados anteriormente (pelo Main.storyboard) ao
arquivo ViewController.h. Cabe a nós implementar cada uma das ações dos
botões. O primeiro método é o showVertical, que representa a animação padrão
57
4.1. Passando de um controlador para outro
Casa do Código
do iOS para o tipo de operação que iremos realizar. O que deve ser feito é criar
uma instância do OpcoesController, especificar o tipo da animação e invocar o
método presentModalViewController.
Vamos primeiro ver a implementação completa do método, conforme a listagem
abaixo:
1 - (IBAction)showVertical:(id)sender {
2
OpcoesController *c = [[OpcoesController alloc] init];
3
c.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
4
5
[self presentViewController:c animated:YES completion:nil];
6 }
Obs:
não
esqueça
de
adicionar
a
instrução
#import
"OpcoesController.h" no início do arquivo.
Na linha 3 é definido o tipo de animação desejado, que no caso é
UIModalTransitionStyleCoverVertical. Esta é a animação padrão, e po-
demos omitir isso na prática. Porém, como neste caso desejamos testar todas as
animações possíveis, é interessante atribuirmos explicitamente o tipo desejado.
Já a linha 5 é a responsável por mostrar de fato o nome controller ao usuário,
através do método presentViewController:animated:completion.
Rode o aplicativo ( Command+R) e clique no botão Subir vertical. Você deverá
ver o OpcoesController cobrir toda a tela, vindo de baixo para cima. Esta foi a
primeira animação. O próximo método a implementar é o showHorizontal, que
mostrará utilizando um efeito de girar a tela horizontalmente. A implementação
completa está abaixo:
- (IBAction)showHorizontal:(id)sender {
OpcoesController *c = [[OpcoesController alloc] init];
c.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:c animated:YES completion:nil];
}
Rode novamente o aplicativo e clique no botão Girar horizontal, e veja a dife-
rença no efeito da animação. Bacana, não?
Repare
bem
na
implementação
dos
métodos
showVertical
e
showHorizontal, e veja que a maior parte do código deles é igual, mu-
dando apenas o tipo de animação desejada. Como temos mais duas animações
58
Casa do Código
Capítulo 4. Coordenando o trabalho com controladores
para implementar, o ideal seria isolar o código em comum a todos os métodos e
centralizá-lo em um único lugar, evitando assim a duplicação de trabalho. Embora
estejamos fazendo apenas um aplicativo de testes, quanto mais cedo adotar a prática
de reutilizar código, mais rapidamente ela se tornará natural, e consequentemente o
seu sistema ficará mais fácil de manter.
Portanto, antes de implementar os demais métodos, vamos primeiro criar um
método que fará todo o trabalho repetitivo, recebendo como parâmetro o tipo de
animação a ser utilizada. Veja a implementação completa abaixo:
-(void) mostraControllerComAnimacao:(UIModalTransitionStyle) estilo {
OpcoesController *c = [[OpcoesController alloc] init];
c.modalTransitionStyle = estilo;
[self presentViewController:c animated:YES completion:nil];
}
O método mostraControllerComAnimacao: é praticamente igual ao có-
digo que fizemos anteriormente, com a diferença de que ele recebe um argumento
especificando o tipo de animação. Coloque a implementação dele em qualquer lugar
da classe (por exemplo, logo abaixo de @implementation), e implemente o resto
dos métodos da seguinte maneira:
- (IBAction)showDissolve:(id)sender {
[self
mostraControllerComAnimacao:UIModalTransitionStyleCrossDissolve];
}
- (IBAction)showPageCurl:(id)sender {
[self
mostraControllerComAnimacao:UIModalTransitionStylePartialCurl];
}
- (IBAction)showVertical:(id)sender {
[self
ostraControllerComAnimacao:UIModalTransitionStyleCoverVertical];
}
- (IBAction)showHorizontal:(id)sender {
[self
mostraControllerComAnimacao:UIModalTransitionStyleFlipHorizontal];
}
59
4.2. Fechar um controlador modal
Casa do Código
Bem mais simples e prático, e sem duplicar código. Rode novamente o aplicativo
e teste cada um dos botões.
4.2
Fechar um controlador modal
Uma coisa que você deve ter notado é que, depois de abir um controlador usando
presentViewController, não havia nenhuma maneira de fechá-lo ou voltar
para a tela anterior. Contudo, isso é bastante simples de se resolver através do mé-
todo dismissViewControllerAnimated:completion, que deve ser adicio-