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.
// Get views. controllerIndex is passed in as the controller we want to go to.
UIView * fromView = tabBarController.selectedViewController.view;
UIView * toView = [[tabBarController.viewControllers objectAtIndex:controllerIndex] view];
// Transition using a page curl.
[UIView transitionFromView:fromView
toView:toView
duration:0.5
options:(controllerIndex > tabBarController.selectedIndex ? UIViewAnimationOptionTransitionCurlUp : UIViewAnimationOptionTransitionCurlDown)
completion:^(BOOL finished) {
if (finished) {
tabBarController.selectedIndex = controllerIndex;
}
}];
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.
// Get the views.
UIView * fromView = tabBarController.selectedViewController.view;
UIView * toView = [[tabBarController.viewControllers objectAtIndex:controllerIndex] view];
// Get the size of the view area.
CGRect viewSize = fromView.frame;
BOOL scrollRight = controllerIndex > tabBarController.selectedIndex;
// Add the to view to the tab bar view.
[fromView.superview addSubview:toView];
// Position it off screen.
toView.frame = CGRectMake((scrollRight ? 320 : -320), viewSize.origin.y, 320, viewSize.size.height);
[UIView animateWithDuration:0.3
animations: ^{
// Animate the views on and off the screen. This will appear to slide.
fromView.frame =CGRectMake((scrollRight ? -320 : 320), viewSize.origin.y, 320, viewSize.size.height);
toView.frame =CGRectMake(0, viewSize.origin.y, 320, viewSize.size.height);
}
completion:^(BOOL finished) {
if (finished) {
// Remove the old view from the tabbar view.
[fromView removeFromSuperview];
tabBarController.selectedIndex = controllerIndex;
}
}];
Esta solução em Swift:
extension TabViewController: UITabBarControllerDelegate {
public func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
let fromView: UIView = tabBarController.selectedViewController!.view
let toView : UIView = viewController.view
if fromView == toView {
return false
}
UIView.transitionFromView(fromView, toView: toView, duration: 0.3, options: UIViewAnimationOptions.TransitionCrossDissolve) { (finished:Bool) in
}
return true
}
}