Hallöchen– ich mal wieder.
Und wieder ein Problem mit einer Animation. Ich habe mir nämlich gedacht, ich baue eine schöne Transition für den Wechsel der VIewController über eine Tabbar.
Und zwar habe ich dafür den UITabBarViewController abgeleitet. Meine Animation 'schiebt' die Views der ViewController nach links/rechts, je nach dem, wo der Zieltab ist.
Das ist auch recht hübsch, allerdings kommt man da zu einem Problem, wenn man von einem UINavigationController zu einem nicht-UINavigationController wechselt bzw. umgekehrt.
Dann nämlich sind die neuen Views jeweils um die Höhe der Statusbar verschoben. Wenn ich das ausgleiche, bleibt unten- direkt über der Tabbar- ein schwarzes Rechteck während der Animation sichtbar.
Der Animationscode:
Alles anzeigen
Es ist eben sehr unschön, ich habe diesen Verschub eben ausgeglichen und dann hat man an andere Stelle ein Problem. Die Animation gefällt mir aber so gut…
Ich hänge Euch mal das Beispielprojekt an. Vielleicht findet ja von Euch jemand einen Fehler in meinem Animationscode bzw. im Setup meines Codes.
Mein Ziel wäre es eben, dass die Übergänge zwischen UINavigationControllern zu non-UINavigationControllern sauber läuft.
Und wieder ein Problem mit einer Animation. Ich habe mir nämlich gedacht, ich baue eine schöne Transition für den Wechsel der VIewController über eine Tabbar.
Und zwar habe ich dafür den UITabBarViewController abgeleitet. Meine Animation 'schiebt' die Views der ViewController nach links/rechts, je nach dem, wo der Zieltab ist.
Das ist auch recht hübsch, allerdings kommt man da zu einem Problem, wenn man von einem UINavigationController zu einem nicht-UINavigationController wechselt bzw. umgekehrt.
Dann nämlich sind die neuen Views jeweils um die Höhe der Statusbar verschoben. Wenn ich das ausgleiche, bleibt unten- direkt über der Tabbar- ein schwarzes Rechteck während der Animation sichtbar.
Der Animationscode:
Quellcode
- - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
- {
- int controllerIndex = [[tabBarController viewControllers] indexOfObject:viewController];
- if(controllerIndex == self.selectedIndex || self.isAnimating)
- {
- return NO;
- }
- UIView *fromView = tabBarController.selectedViewController.view;
- UIView *toView = [viewController view];
- CGRect viewSize = fromView.frame;
- BOOL scrollRight = controllerIndex > tabBarController.selectedIndex;
- [fromView.superview addSubview:toView];
- if ([self shouldAdjustFrameDownFromViewController:tabBarController.selectedViewController toViewController:viewController])
- {
- toView.frame = CGRectMake((scrollRight ? 320 : -320), viewSize.origin.y+20, 320, viewSize.size.height);
- }
- else if ([self shouldAdjustFrameUpFromViewController:tabBarController.selectedViewController toViewController:viewController])
- {
- toView.frame = CGRectMake((scrollRight ? 320 : -320), viewSize.origin.y-20, 320, viewSize.size.height);
- }
- else
- {
- toView.frame = CGRectMake((scrollRight ? 320 : -320), viewSize.origin.y, 320, viewSize.size.height);
- }
- [toView setNeedsDisplay];
- [UIView animateWithDuration:0.3 animations: ^
- {
- [self.tabBar setUserInteractionEnabled:NO];
- toView.alpha = 0;
- fromView.frame = CGRectMake((scrollRight ? -320 : 320), viewSize.origin.y, 320, viewSize.size.height);
- if ([self shouldAdjustFrameDownFromViewController:tabBarController.selectedViewController toViewController:viewController])
- {
- toView.frame = CGRectMake(0, viewSize.origin.y+20, 320, viewSize.size.height);
- }
- else if ([self shouldAdjustFrameUpFromViewController:tabBarController.selectedViewController toViewController:viewController])
- {
- toView.frame = CGRectMake(0, viewSize.origin.y-20, 320, viewSize.size.height);
- }
- else
- {
- toView.frame = CGRectMake(0, viewSize.origin.y, 320, viewSize.size.height);
- }
- [UIView animateWithDuration:0.8 animations:^
- {
- [fromView setAlpha:0];
- [toView setAlpha:1];
- }
- completion:^(BOOL finished)
- {
- [fromView setAlpha:1];
- }];
- }
- completion:^(BOOL finished)
- {
- if (finished)
- {
- [toView setNeedsDisplay];
- [fromView removeFromSuperview];
- tabBarController.selectedIndex = controllerIndex;
- [self.tabBar setUserInteractionEnabled:YES];
- }
- }];
- return NO;
- }
Es ist eben sehr unschön, ich habe diesen Verschub eben ausgeglichen und dann hat man an andere Stelle ein Problem. Die Animation gefällt mir aber so gut…
Ich hänge Euch mal das Beispielprojekt an. Vielleicht findet ja von Euch jemand einen Fehler in meinem Animationscode bzw. im Setup meines Codes.
Mein Ziel wäre es eben, dass die Übergänge zwischen UINavigationControllern zu non-UINavigationControllern sauber läuft.