Оновлення 04/2016: Юсті хотів оновити це, щоб сказати спасибі всім за всі голоси. Зауважте також, що це спочатку було написано ще коли ... перед ARC, перед обмеженнями, перед ... багато чого! Тому, будь ласка, врахуйте це, вирішуючи, чи використовувати ці методи. Можливо, є більш сучасні підходи. О, і якщо ви знайдете його. Будь ласка, додайте відповідь, щоб усі могли бачити. Дякую.
Через деякий час ...
Після довгих досліджень я придумав два робочих рішення. Обидва вони працювали та робили анімацію між вкладками.
Рішення 1: перехід від перегляду (простий)
Це найпростіший і використовує заздалегідь визначений метод переходу UIView. За допомогою цього рішення нам не потрібно керувати думками, оскільки метод працює для нас.
// 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;
}
}];
Рішення 2: прокрутка (більш складна)
Більш складне рішення, але дає більше контролю над анімацією. У цьому прикладі ми отримуємо подання та вимикання. За допомогою цього нам потрібно самостійно керувати поглядами.
// 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;
}
}];
Це рішення у 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
}
}