Concrete Logo
Hamburger button

View Controller Transition – Parte 3

  • Blog
  • 13 de Dezembro de 2017
Share

Há um tempinho atrás, falei sobre View Controller Transition no Coders on Beer, evento realizado pela Concrete, no qual o capítulo da vez fala sobre diversos assuntos relacionados a desenvolvimento.

A propósito, estamos contratando \o/

Bem, eu havia separado para o final um slide Bônus Track falando exatamente sobre isso. Afinal, até então havíamos comentado apenas do controller, do present, dos dismiss… Mas como que o transition delegate se comporta em uma navigation controller ou em uma tabbar?

Se você caiu aqui de paraquedas e estranhou ao ler “transition delegate”, dá um bizu no primeiro post da série 😀


Como você já sabe, toda View Controller possui um Transition Delegate. Logo, tanto a UINavigationController quanto a UITabbarController também possuem um delegate de transição. Porém…

Porém os dois têm também um delegate que gerencia outros itens, além, claro, da transição.

  • UINavigationControllerDelegate: este delegate é acionado quando uma view controller é inserida (pushed) ou deslocada (popped) da stack de uma navigation controller;
  • UITabbarControllerDelegate: utilizamos este delegate quando queremos aumentar ou melhorar, ou customizar o comportamento de uma tabbar. Podemos utilizar, por exemplo, para determinar quais abas devem ser selecionadas para executar ações e, após uma aba ser selecionada, alterar a sua ordem etc.

Apesar de os dois delegates terem comportamentos e abordagens diferentes, eles possuem algumas coisas em comum e a que vamos abordar aqui é o almightytransition delegate.


UINavigationControllerDelegate

Diferente de uma view controller comum, nós não precisamos criar um custom transition delegate para a navigation controller. Seu delegate já possui métodos que podemos implementar, a fim de retornar uma animação customizada (UIViewControllerAnimatedTransitioning) e/ou interativa (UIViewControllerInteractiveTransitioning).

Crie uma classe que implemente o protocolo UINavigationControllerDelegate e implemente os métodos:

O primeiro método vai retornar um UIViewControllerInteractiveTransitioningobject, que é o nosso interactor mostrado no post View Controller Transition-parte 2. O segundo vai retornar um objeto de animação, o UIViewControllerAnimatedTransitioning, que vai conter toda a animação entre uma controller e outra.

Daqui pra frente, o fluxo de transição segue o mesmo padrão descrito no post View Controller Transition-parte 1. Nada muda, exceto o nosso gerenciador de gestos, caso você queira fazer uma transição interativa.

Lembra deste método?

Como estamos falando de uma Navigation Controller no .began case, em vez de chamar o método present(viewController), você vai chamar o pushViewController da sua navigation controller.

De igual forma, também vamos precisar ajustar esse handler para quando a controller for removida da stack. Em vez de chamar o dismiss, vamos chamar o popViewController.

Simples, não? Mas e a Tabbar?

UITabbarControllerDelegate

Assim como a Navigation Controller Delegate, a Tabbar Controller Delegate também nos fornece os métodos de transition delegate:

De igual forma, vamos retornar um objeto de animação e um interactor (caso a gente faça uma transição interativa). Precisamos ficar atentos apenas em dois pontos quando formos controlar a transição entre controllers em uma tabbar:

  1. Dentro do nosso objeto de animação, precisamos identificar através do selectedIndex da tabbar, se o sentido da animação vai ser para a direita, ou para a esquerda. Lembrando sempre que a animação da transição deve ser bem coerente com a ação ou gesto que o usuário está fazendo;
  2. No gerenciador de gestos, nós não vamos mais precisar chamar os métodos de present (present, push) no .began case, nem vamos precisar chamar os métodos de dismiss (dismiss, pop). Neste caso, vamos precisar apenas gerenciar o selectedIndex da nossa tabbar, incrementando ou decrementando o valor da aba selecionada.

Feito isso, o comportamento vai seguir o mesmo ciclo do transition delegate.


Uma dúvida que surgiu durante o Coders on Beer foi em relação à prioridade dos delegates.

Por exemplo, se eu tiver na stack da navigation controller uma controller que também implementa um transition delegate, qual vai ser considerado? Eu posso conviver com ambos?

Primeiro, sim, ambos convivem tranquilamente. Segundo, é muito importante termos em mente que o fluxo de transição atua dentro de um contexto.

Com isso em mente, se eu chamar o pushViewController, qual transition delegate vai ser acionado? O da view controller ou o da navigation controller?

Se eu chamar o dismiss, qual transition delegate vai ser acionado? O da navigation controller ou o da view controller?

Podemos perceber que ambos podem conviver lado a lado, pois atuam em contextos diferentes.

De igual forma, o transition delegate da tabbar não é afetado, pois o que realmente controla a view controller apresentada é o nosso selectedIndex.


Dúvidas? Comente aqui embaixo e vamos triturar nas transições. \o/

Só não vai esquecer de atribuir o delegate da navigation/tabbar ao seus respectivos criados, ok? Se não nada funfa. ^^

Carry on!

Manja dos paranauê dos desenvolvimento mobile e quer trabalhar em um time ágil de verdade? Vem pra cá!