Actualización 04/2016: Justed quería actualizar esto para agradecer a todos por todos los votos. Tenga en cuenta también que esto se escribió originalmente cuando ... antes de ARC, antes de las restricciones, antes ... ¡muchas cosas! Por lo tanto, tenga esto en cuenta al decidir si utilizar estas técnicas. Puede haber enfoques más modernos. Ah, y si encuentras uno. Agregue una respuesta para que todos puedan verla. Gracias.
Algún tiempo después ...
Después de mucha investigación, se me ocurrieron dos soluciones de trabajo. Ambos funcionaron e hicieron la animación entre pestañas.
Solución 1: transición desde la vista (simple)
Este es el más fácil y utiliza un método de transición UIView predefinido. Con esta solución no necesitamos administrar las vistas porque el método hace el trabajo por nosotros.
// 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;
}
}];
Solución 2: scroll (más complejo)
Una solución más compleja, pero le brinda más control de la animación. En este ejemplo, las vistas se activan y desactivan. Con este tenemos que gestionar las vistas nosotros mismos.
// 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 solución en 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
}
}