Mise à jour 04/2016: Justed voulait mettre à jour ceci pour dire merci à tous pour tous les votes. Veuillez également noter que cela a été écrit à l'origine quand ... avant ARC, avant les contraintes, avant ... beaucoup de choses! Veuillez donc en tenir compte lorsque vous décidez d'utiliser ces techniques. Il existe peut-être des approches plus modernes. Oh, et si vous en trouvez un. Veuillez ajouter une réponse pour que tout le monde puisse la voir. Merci.
Un peu plus tard ...
Après de nombreuses recherches, j'ai proposé deux solutions fonctionnelles. Les deux ont fonctionné et ont fait l'animation entre les onglets.
Solution 1: transition de la vue (simple)
C'est le plus simple et utilise une méthode de transition UIView prédéfinie. Avec cette solution, nous n'avons pas besoin de gérer les vues car la méthode fait le travail pour nous.
// 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;
}
}];
Solution 2: faire défiler (plus complexe)
Une solution plus complexe, mais qui vous donne plus de contrôle sur l'animation. Dans cet exemple, nous faisons glisser les vues sur et en dehors. Avec celui-ci, nous devons gérer nous-mêmes les vues.
// 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;
}
}];
Cette solution dans 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
}
}