Update 04/2016: Justed wollte dies aktualisieren, um sich bei allen für alle Stimmen zu bedanken. Bitte beachten Sie auch, dass dies ursprünglich vor langer Zeit geschrieben wurde, als ... vor ARC, vor Einschränkungen, vor ... vielen Dingen! Bitte berücksichtigen Sie dies, wenn Sie entscheiden, ob Sie diese Techniken verwenden möchten. Es kann modernere Ansätze geben. Oh, und wenn Sie einen finden. Bitte fügen Sie eine Antwort hinzu, damit jeder sehen kann. Vielen Dank.
Etwas später ...
Nach langem Suchen habe ich zwei funktionierende Lösungen gefunden. Beide funktionierten und führten die Animation zwischen den Registerkarten durch.
Lösung 1: Übergang von der Ansicht (einfach)
Dies ist die einfachste und verwendet eine vordefinierte UIView-Übergangsmethode. Mit dieser Lösung müssen wir die Ansichten nicht verwalten, da die Methode die Arbeit für uns erledigt.
// 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;
}
}];
Lösung 2: Scrollen (komplexer)
Eine komplexere Lösung, mit der Sie die Animation besser steuern können. In diesem Beispiel werden die Ansichten ein- und ausgeschaltet. Mit diesem müssen wir die Ansichten selbst verwalten.
// 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;
}
}];
Diese Lösung 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
}
}