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?

War es hilfreich?

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:

iPhone: UINavigationBar mit Tasten - stellen Sie die Höhe

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top