Edit: Ich habe John die Prämie zugesprochen, da er viel Mühe in seine Antwort gesteckt hat, und würde es sowieso bekommen, aber es gibt immer noch keine funktionierende Lösung. Ich suche immer noch nach einer Antwort, wenn jemand weiß, wie man das macht, würde es sehr geschätzt werden.Hide UINavBar und UITabBar gleichzeitig mit Animation
Ich möchte eine "Maximieren" -Schaltfläche zu meiner App hinzufügen, die die Navigations- und Tab-Leiste versteckt. Die Navigationsleiste und die Tableiste sollten gleichmäßig ein- und ausgefahren werden, und die innere/Inhaltsansicht sollte mit derselben Geschwindigkeit wie die Navigationsleiste und die Tableiste erweitert und verkleinert werden.
Ich verwendete [self.navigationController setNavigationBarHidden: YES/NO animated: YES];
für die Navigationsleiste und fand diesen Thread How to hide uitabbarcontroller zum Ausblenden der Tableiste.
UITabBar Klassenerweiterung:
- (void) setTabBarHidden:(BOOL)hidden animated:(BOOL)animated {
CGRect screenRect = [[UIScreen mainScreen] bounds];
float screenHeight = screenRect.size.height;
if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
screenHeight = screenRect.size.width;
}
if (!hidden) {
screenHeight -= self.tabBar.frame.size.height;
}
[UIView animateWithDuration: (animated ? UINavigationControllerHideShowBarDuration : 0) animations: ^{
for (UIView* each in self.view.subviews) {
if (each == self.tabBar) {
[each setFrame: CGRectMake(each.frame.origin.x, screenHeight, each.frame.size.width, each.frame.size.height)];
} else {
[each setFrame: CGRectMake(each.frame.origin.x, each.frame.origin.y, each.frame.size.width, screenHeight)];
}
}
} completion: ^(BOOL finished) {
NSLog(@"Animation finished %d", finished);
}];
}
Das Problem ist, wenn ich die beiden zugleich (Aus-/Einblenden der nav und Tab-Leiste) verwenden, ist es nicht sauber ist. Wenn die Navigationsleiste zuerst kommt, springt alles, was an der Unterseite verankert ist (siehe Beispiel unten), und wenn die Navigationsleiste zuerst kommt, springt die Spitze.
Beispiel: positioniere ich die UIButton in der rechten unteren Ecke und legen Sie den automatischen Größen
resizeButton.frame = CGRectMake(self.view.bounds.size.width - 50, self.view.bounds.size.height - 100, 32, 32); // hardcoded just for testing purposes
resizeButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;
Maske Aber wenn die navbar und Tabbar minimiert die UIButton springt zwischen den beiden Zuständen (nicht gleitet zusammen mit der Registerkarte Bar). Wenn ich es jedoch so ändere, dass es oben rechts angebracht wird, gleitet es perfekt mit der Navigationsleiste.
Weiß jemand, wie man das löst?
bearbeiten: Dies ist der Schrank und eleganteste Lösung, die ich bisher haben (nur ein Arbeitskonzept zu erhalten versuchen):
[UIView animateWithDuration: UINavigationControllerHideShowBarDuration animations: ^{
if (self.isMaximized) {
self.tabBarController.view.frame = CGRectMake(0, 20, screenRect.size.width, screenRect.size.height + 49 - 20);
[self.navigationController setNavigationBarHidden:YES animated:YES];
} else {
self.tabBarController.view.frame = CGRectMake(0, 20, screenRect.size.width, screenRect.size.height - 20);
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
} completion: ^(BOOL finished) {
NSLog(@"Frame done: %@", NSStringFromCGRect(self.view.frame));
return;
}];
auf die Maximierung:
- Verschiebt die Navigationsleiste nach oben und gleichzeitig die Tableiste nach unten.
- Die Oberseite der inneren/co ntent Blick gleitet nach oben, und der Boden dieser Ansicht springt
auf der Minimierung:
- Slides die navbar nach unten und schiebt den Tabbar auf, zugleich
- Die Spitze der Innen-/Seiten gleitet richtig nach unten, aber der Boden springt auf den Endwert, Leerzeichen zurückbleibt, die dann durch das Gleiten Tabbar bedeckt ist
Wenn ich die Reihenfolge der Minimierungs-Animationen (so der navbar animatino rearange wird zuerst) genannt wird, dann springt die oben in der Innen/content Ansicht
'beginAnimations' \' commitAnimations'? Diese Art der Animation von Ansichten ist seit langem nicht mehr zugunsten blockbasierter Animationen. – Abizern
Die Größe der inneren/Inhaltsansicht wird nicht geändert. – Raekye
nur ich probierte die Navigationsleiste und die Tableiste nur, wenn Sie die innere/inhaltliche Ansicht ändern möchten. Diesen Code auf die gleiche Weise versuchen. Wenn Sie Zweifel haben, werde ich Ihnen helfen – Ravindhiran