UINavigationBar automatischen Größen
-
30-09-2019 - |
Frage
In meiner app, habe ich eine UINavigationController. Leider, wenn ich das Gerät und die Schnittstelle Orientierungsänderungen drehen, wird die UINavigationBar nicht seine Höhe verändern. In anderen iPhone-Anwendungen, wie zum Beispiel der Contacts.app, erhält die Navigationsleiste etwas weniger hoch im Querformat. Es muss eingebaut, werden, denn wenn Sie die Navigationsbeispielanwendung aus dem XCode Menü nehmen und Interface-Orientierung, um es hinzuzufügen, es die Höhe der Navigationsleiste ändert richtig.
Wie kann ich die Navigationsleiste Resize machen, wie es in allen anderen iPhone tut apps die ich gesehen habe?
Lösung
Ich habe einen wenig Test durchgeführt, und obwohl ich nicht wie die Methode, es ist ziemlich einfach zu tun.
Nachdem für eine private Methode gesucht, die gearbeitet haben, konnte ich nicht finden. Alles, was ich fand, war:
@property BOOL forceFullHeightInLandscape;
- (BOOL)isMinibar;
Es gibt keine Setter für -isMinibar
, so können wir nicht festgelegt, dass. Ich glaube, dass es einen Wert zurückgibt, basierend auf seiner Höhe. Auch forceFullHeightInLandscape
wurde NO
gesetzt, aber es immer noch nicht einstellen seine Höhe.
Während der autoresizingMask
Wechsel schließen UIViewAutoresizingFlexibleHeight
, die Ansicht hat die Größe kleiner sein, aber jetzt war es zu klein. Allerdings -isMinibar
plötzlich zurück YES
. Also, das hat mich an nur die Aussicht Resize sich im Stich gelassen, es auf die richtige Höhe eingestellt wird.
Also los wir, ein Verfahren, das funktioniert auch ohne private API-Aufrufe:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self.navigationBar performSelector:@selector(sizeToFit) withObject:nil afterDelay:(0.5f * duration)];
}
Eine Sache, die Sie zu tun haben, ist, dass die Ansichten unter dem Balken werden nicht auf die kleinere bar eingestellt bekommen, so dass es eine Lücke zwischen der Bar sein und den Ansichten unten. Der einfachste Weg, dies zu lösen, ist ein Behälter Ansicht hinzuzufügen, genau wie der Fall mit einem UINavigationController
. Sie würden sich etwas einfallen lassen, wie:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self performSelector:@selector(resizeViewsForNavigationBar) withObject:nil afterDelay:(0.5f * duration)];
}
- (void)resizeViewsForNavigationBar {
[self.navigationBar sizeToFit];
// Resize containerView accordingly.
CGRect containerViewRect = self.containerView.frame;
containerViewRect.origin.y = CGRectGetMaxY(self.navigationBar.frame);
containerViewRect.size.height = CGRectGetMaxY(self.view.frame) - containerViewRect.origin.y;
self.containerView.frame = containerViewRect;
}
Andere Tipps
Ich denke, das Verhalten, das Sie nur wollen passiert, wenn eine Navigationssteuerung (die die Stäbe (Navigation oder Symbolleiste darstellt)), um das Fenster in der AppDelegate hinzugefügt wird oder durch eine Tab-Leiste dargestellt, etc.
Sie können eine Navigationsleiste über IB hinzufügen oder Code, bedeutet dies nicht, dass Sie einen Navigationscontroller haben. Meine Meinung ist, erstellt einen Navigationscontroller und initialisieren es mit den View-Controller in dem Sie arbeiten. Wahrscheinlich, wenn die Ansicht dreht, wird die Navigationsleiste ein wenig schrumpfen wird, so, wie Sie mögen.
Hope, das hilft
Dank Joost Ich habe hinzugefügt
@property BOOL forceFullHeightInLandscape;
zu meinen benutzerdefinierten UINavigationBar Klasse. Und setzt in:
-(id)initWithFrame:(CGRect)frame{
forceFullHeightInLandscape = YES;
Arbeitete wie ein Charme
ähnlich wie Joost Antwort, aber die Methode in willAnimateRotationToInterfaceOrientation
setzen hat einen besseren Animationseffekt als willRotateToInterfaceOrientation
. (Es gibt keine Animation Verzögerung)
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self.navigationBar sizeToFit];
}
Ich hatte gerade diesen Fehler als gut, und obwohl es wahrscheinlich nicht aus dem gleichen Grund würde ich es gerne hier Hilfe jemand Anderem, dass goofs.
Wenn Sie willRotateToInterface
Methoden sind zwingende, erinnern super
anrufen
Ich blendete auf das, aber sobald ich die akzeptierte Antwort sah es kam zu mir.
ich denke, das eine Art ähnlich ist, Ihnen und sie haben den Code-Schnipsel:
Ich habe gerade versucht, ein paar Dinge nur innerhalb Interface Builder und Xcode und solange Sie die UINavigationBarController
als RootViewController
verwenden funktioniert es wie beschrieben - immer kleiner. Haben Sie irgendwelche Dinge ändern sich innerhalb des Controllers selbst oder in Teilen, wie die Steuerung geladen wird? Vor allem in Bezug auf das Abfeuern von Ereignissen? Ich hatte ein paar schlechte expiriences mit dem UITabBarController
in Bezug auf die richtige Messaging brechen und bekam einige ‚interessante‘ Ansicht Nebenwirkungen. Nur ein Versuch und eine Vermutung.
(void)viewWillLayoutSubviews {
self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds;
}