Estou alternando as guias programaticamente em um aplicativo conduzido por barra de guias usando UITabBarController.selectedIndex
. O problema que estou tentando resolver é como animar a transição entre as visualizações. ou seja, da visualização da guia atual para a visualização da guia selecionada.
O primeiro pensamento foi fazer uso do UITabBarControllerDelegate
, mas parece que ele não é chamado ao alternar entre guias programaticamente. Agora estou considerando UITabBarDelegate.didSelectItem
: como um possível gancho para definir uma animação de transição.
Alguém conseguiu animar as transições? Se sim, como?
ios4
uitabbarcontroller
uitabbar
drekka
fonte
fonte
Respostas:
Atualização 04/2016: Justed queria atualizar isso para agradecer a todos por todos os votos. Observe também que isto foi escrito originalmente quando ... antes do ARC, antes das restrições, antes de ... muitas coisas! Portanto, leve isso em consideração ao decidir se usará essas técnicas. Pode haver abordagens mais modernas. Ah, e se você encontrar um. Adicione uma resposta para que todos possam ver. Obrigado.
Algum tempo depois ...
Depois de muita pesquisa, descobri duas soluções de trabalho. Ambos funcionaram e fizeram a animação entre as guias.
Solução 1: transição da visão (simples)
Este é o mais fácil e usa um método de transição UIView predefinido. Com esta solução, não precisamos gerenciar as visualizações porque o método faz o trabalho para nós.
Solução 2: rolar (mais complexo)
Uma solução mais complexa, mas oferece mais controle da animação. Neste exemplo, obtemos as visualizações para ativar e desativar. Com este, precisamos gerenciar as visualizações nós mesmos.
Esta solução em Swift:
fonte
shouldSelectViewController
método do delegado TabBar e retornar NÃO láa seguir é minha tentativa de usar o formulário de código drekka no método delegado (UITabBarControllerDelegate)
fonte
Minha solução para iOS7.0 ou superior.
Você pode especificar um controlador de animação personalizado no delegado da barra de guias.
Implemente um controlador de animação como este:
Em seguida, use-o em seu UITabBarControllerDelegate:
fonte
Em vez de usar
tabBarController:shouldSelectViewController:
é melhor implementartabBarController:animationControllerForTransitionFromViewController:toViewController:
TransitioningObject.swift
TabBarViewController.swift
fonte
Eu acho que você pode facilmente conseguir transições para UITabBarControlelr usando CATransition; Isso também resolverá quaisquer efeitos colaterais do uso de transactionFromView: toView:
Use-o dentro de sua classe TabBarController personalizada estendida de UITabBarController.
Espero que isto ajude :)
fonte
Escrevi um post depois de tentar as várias respostas aqui.
O código está em Swift e você pode alterar programaticamente a guia com animação chamando
animateToTab
.Se você quiser que todas as alterações de guia tenham a animação, conecte-a
UITabBarControllerDelegate
como esta:fonte
Minha solução em Swift:
Crie uma classe TabBar personalizada e configure-a em seu storyboard TabBar
fonte
finished
será falso). Não sei por que isso aconteceu, mas acho que tem a ver com a transformação do CA que pensa que não há "nada para animar". Mudei para a animação com frames e funcionou.Usei a solução de @Mofumofu e atualizei para Swift 1.2 e também implementei uma animação para cima / para baixo. Ou seja, o novo ViewController surge e empurra o antigo para cima se o índice do novo viewcontroller for maior que o antigo. Caso contrário, a direção é para baixo.
No Container ViewController:
fonte
Aqui está minha solução Swift 3:
Eu substituo o selectedIndex do meu UITabBarViewController assim:
Então eu uso esta função que imita a animação push / pop nativa:
Espero que ajude :)
fonte
uma correção para a animação nervosa ...
UIView * fromView = self.view.superview;
fonte
isso pode ser resolvido de duas maneiras
1 - Escreva isso no arquivo AppDelegate.m uma vez. Lembre-se de incluir UITabBarControllerDelegate usando <> depois de dois pontos (:) em seu AppDelegate.h
2 - Escreva isso em cada um de seus arquivos ViewController.m
espero que esta ajuda ...!
fonte
Você pode animar dependendo do item tocado - Neste exemplo, invertemosFromLeft se o índice tocado for> do que o índice selecionado anteriormente e invertemosFromRight se o índice tocado for <do que o índice selecionado anteriormente. Este é o Swift 4: implemente o método UITabBarControllerDelegate
fonte
A resposta de drekka é realmente ótima. Ajustei um pouco a transição de rolagem para que a animação parecesse mais com a animação push da Apple. Eu adicionei uma animação adicional após a conclusão da primeira animação para fazer com que o efeito deslizante pareça certo.
fonte
Eu queria usar uma transição flip entre dois controladores de visualização filho em um toque de botão e consegui da seguinte maneira:
Também defini a cor de fundo como preto, no meu caso fiz isso definindo o navigationController.view.backgroundColor, mas no seu caso pode ser o window.backgroundColor que pode ser facilmente definido no delegado do aplicativo.
fonte
Aqui está meu código de trabalho ( para 3 guias , não tentei mais !!) para animar as transições entre as guias. É baseado principalmente na solução de drekka, mas já implementado no método delegado da tabbar, então deve funcionar se você apenas copiar / colar. (Você nunca sabe!)
}
fonte
Isso funciona para mim no Swift 3:
fonte
@samwize Resposta traduzida para Swift 3 - 2 polegares para cima, cria um efeito de página da esquerda para a direita:
fonte
Resposta de @samwize atualizada para Swift 5:
Se você quiser que todas as alterações da guia tenham a animação, use um UITabBarControllerDelegate e implemente este método:
Altere programaticamente a guia com animação chamando
animateToTab
:fonte
Swift 4+
Seu
UITabBarControllerDelegate
método deve ser assim,E o método é,
fonte