Aggiornamento 04/2016 : Justed voleva aggiornare questo per dire grazie a tutti per tutti i voti. Nota anche che questo è stato scritto originariamente molto tempo fa, quando ... prima di ARC, prima dei vincoli, prima ... di molte cose! Quindi tienilo in considerazione quando decidi se utilizzare queste tecniche. Potrebbero esserci approcci più moderni. Oh, e se ne trovi uno. Aggiungi una risposta in modo che tutti possano vederla. Grazie.
Qualche tempo dopo ...
Dopo molte ricerche ho trovato due soluzioni di lavoro. Entrambi hanno funzionato e fatto l'animazione tra le schede.
Soluzione 1: transizione dalla visualizzazione (semplice)
Questo è il più semplice e utilizza un metodo di transizione UIView predefinito. Con questa soluzione non abbiamo bisogno di gestire le viste perché il metodo fa il lavoro per noi.
// 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;
}
}];
Soluzione 2: scorrimento (più complesso)
Una soluzione più complessa, ma che offre un maggiore controllo sull'animazione. In questo esempio si ottengono le visualizzazioni da attivare e disattivare. Con questo dobbiamo gestire noi stessi le visualizzazioni.
// 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;
}
}];
Questa soluzione in 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
}
}