Обновление 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
}
}