Aktualizacja 04/2016: Justed chciał to zaktualizować, aby podziękować wszystkim za wszystkie głosy. Proszę również zauważyć, że zostało to napisane dawno temu, kiedy ... przed ARC, przed ograniczeniami, przed ... wieloma rzeczami! Dlatego proszę wziąć to pod uwagę przy podejmowaniu decyzji o zastosowaniu tych technik. Mogą istnieć bardziej nowoczesne podejścia. Aha, i jeśli znajdziesz. Dodaj odpowiedź, aby wszyscy mogli ją zobaczyć. Dzięki.
Jakiś czas później ...
Po wielu badaniach wymyśliłem dwa działające rozwiązania. Oba działały i tworzyły animację między kartami.
Rozwiązanie 1: przejście z widoku (proste)
Jest to najłatwiejsze i wykorzystuje predefiniowaną metodę przejścia UIView. Dzięki temu rozwiązaniu nie musimy zarządzać widokami, ponieważ metoda działa za nas.
// 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;
}
}];
Rozwiązanie 2: przewiń (bardziej złożone)
Bardziej złożone rozwiązanie, ale zapewnia większą kontrolę nad animacją. W tym przykładzie możemy włączyć i wyłączyć widoki. W tym przypadku musimy sami zarządzać widokami.
// 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;
}
}];
To rozwiązanie w 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
}
}