Ich habe den Code darunter, der die Navigationsleiste verbirgt und anzeigt. Es wird ausgeblendet, wenn die erste Ansicht geladen wird, und dann ausgeblendet, wenn die "Kinder" aufgerufen werden. Das Problem ist, dass ich das Ereignis / die Aktion zum Auslösen nicht finden kann, wenn sie zur Stammansicht zurückkehren.
Ich habe eine "Test" -Schaltfläche auf der Stammseite, die die Aktion manuell ausführt, aber sie ist nicht schön und ich möchte, dass sie automatisch erfolgt.
-(void)hideBar
{
self.navController.navigationBarHidden = YES;
}
-(void)showBar
{
self.navController.navigationBarHidden = NO;
}
quelle
animated=YES
. Ich weiß, dass es hässlich aussiehtanimated=NO
, aber wenn die Animation zum Ausblenden der Navigationsleiste noch nicht fertig ist, wird die Animation zum erneuten Anzeigen ignoriert. Noch keine Lösung.Ein anderer Ansatz, den ich gefunden habe, besteht darin, einen Delegierten für Folgendes festzulegen
NavigationController
:und verwenden
setNavigationBarHidden
innavigationController:willShowViewController:animated:
Einfache Möglichkeit, das Verhalten für
ViewController
alle an einem Ort anzupassen .quelle
Eine kleine Änderung, die ich an den anderen Antworten vornehmen musste, besteht darin, die Leiste in viewWillDisappear nur dann einzublenden, wenn der Grund dafür ist, dass sie verschwindet, weil ein Navigationselement darauf gedrückt wird. Dies liegt daran, dass die Ansicht aus anderen Gründen verschwinden kann.
Daher mache ich die Leiste nur dann wieder sichtbar, wenn diese Ansicht nicht mehr die oberste Ansicht ist:
quelle
Ich würde den Code in den viewWillAppear- Delegaten für jede angezeigte Ansicht einfügen :
So, wo Sie es verstecken müssen:
So, wo Sie es zeigen müssen:
quelle
Die aktuell akzeptierte Antwort stimmt nicht mit dem in der Frage beschriebenen beabsichtigten Verhalten überein. In der Frage wird gefragt, ob die Navigationsleiste auf dem Root-View-Controller ausgeblendet, aber überall sichtbar ist. Die akzeptierte Antwort verbirgt jedoch die Navigationsleiste auf einem bestimmten View-Controller. Was passiert, wenn eine andere Instanz des ersten View Controllers auf den Stack verschoben wird? Die Navigationsleiste wird ausgeblendet, obwohl wir nicht auf den Root-View-Controller schauen.
Stattdessen ist die Strategie von @Chad M., das zu verwenden,
UINavigationControllerDelegate
gut, und hier ist eine vollständigere Lösung. Schritte:UINavigationController
-navigationController:willShowViewController:animated
Methode zum Ein- oder Ausblenden der Navigationsleiste, je nachdem, ob der Root-View-Controller angezeigt wirdDen vollständigen Code für diese Lösung finden Sie in dieser Übersicht . Hier ist die
navigationController:willShowViewController:animated
Implementierung:quelle
in Swift 3:
quelle
navcontroller.navagationBarHidden
es den gesamten Navigationscontroller kaputt macht (kein Hin- und Herwischen). Um es zum Laufen zu bringen, habe ichnavigationController?.navigationBar.hidden
stattdessen verwendet. Das Wischen funktioniert immer noch und es lässt keinen leeren Raum, weil es sich in einer Stapelansicht oder so zu befinden scheintGeben Sie der Antwort von @ chad-m meine Ehre.
Hier ist die Swift-Version:
MyNavigationController.swift
Unterschied zwischen der Antwort von chad-m und meiner:
Erben Sie von UINavigationController, damit Sie Ihren rootViewController nicht verschmutzen.
Verwenden Sie
self.viewControllers.first
statthomeViewController
, damit Sie dies nicht 100 Mal für Ihre 100 UINavigationController in 1 StoryBoard tun.quelle
Nach mehreren Versuchen hier ist, wie ich es für das, was ich wollte, zum Laufen gebracht habe. Das habe ich versucht. - Ich habe eine Ansicht mit einem Bild. und ich wollte, dass das Bild im Vollbildmodus angezeigt wird. - Ich habe auch einen Navigationscontroller mit einer TabBar. Also muss ich das auch verstecken. - Außerdem war meine Hauptanforderung, mich nicht nur zu verstecken, sondern auch beim Ein- und Ausblenden einen verblassenden Effekt zu haben.
So habe ich es zum Laufen gebracht.
Schritt 1 - Ich habe ein Bild und der Benutzer tippt einmal auf dieses Bild. Ich fange diese Geste ein und schiebe sie in das Neue
imageViewController
, es ist in derimageViewController
, ich möchte ein Vollbild haben.Schritt 2 - Alle folgenden Schritte befinden sich im ImageViewController
Schritt 2.1 - Zeigen Sie in ViewDidLoad die Navigationsleiste an
Schritt 2.2 -
viewDidAppear
Richten Sie eine Timer-Task mit Verzögerung ein (ich habe sie auf 1 Sek. Verzögerung eingestellt). Fügen Sie nach der Verzögerung einen Fading-Effekt hinzu. Ich benutze Alpha, um Fading zu verwenden.Schritt 2.3 -
viewWillAppear
Fügen Sie unter SingleTap-Geste zum Bild hinzu und machen Sie die navBar durchscheinend.Schritt 3 - Stellen Sie schließlich
viewWillDisappear
sicher, dass Sie alle Sachen zurücklegenquelle
Für den Fall, dass jemand immer noch Probleme mit dem abgebrochenen schnellen Backswipe-Fehler hat, wie @fabb in der akzeptierten Antwort kommentiert hat.
Ich schaffe es, dies durch Überschreiben zu beheben
viewDidLayoutSubviews
, zusätzlichviewWillAppear/viewWillDisappear
wie unten gezeigt:In meinem Fall stelle ich fest, dass der Root-View-Controller (wo nav ausgeblendet ist) und der Push-View-Controller (nav wird angezeigt) unterschiedliche Statusleistenstile haben (z. B. dunkel und hell). Sobald Sie den Backswipe starten, um den Ansichts-Controller zu öffnen, wird eine zusätzliche Farbanimation in der Statusleiste angezeigt. Wenn Sie Ihren Finger loslassen, um den interaktiven Pop abzubrechen, während die Statusleistenanimation noch nicht abgeschlossen ist , ist die Navigationsleiste für immer verschwunden!
Dieser Fehler tritt jedoch nicht auf, wenn die Statusleistenstile beider Ansichtssteuerungen identisch sind.
quelle
Wenn Sie die Navigationsleiste vollständig im Controller ausblenden möchten, besteht eine viel sauberere Lösung darin, im Root-Controller Folgendes zu haben:
Wenn Sie eine untergeordnete Ansicht in der Steuerung verschieben, bleibt die Navigationsleiste ausgeblendet. Wenn Sie es nur im untergeordneten Element anzeigen möchten, fügen Sie den Code zum Anzeigen
it(self.navigationController.navigationBarHidden=NO;)
imviewWillAppear
Rückruf und den Code zum Ausblenden hinzuviewWillDisappear
quelle
Die einfachste Implementierung kann darin bestehen, dass jeder Ansichts-Controller angibt, ob seine Navigationsleiste in seiner
viewWillAppear:animated:
Methode ausgeblendet ist oder nicht . Der gleiche Ansatz eignet sich auch zum Ausblenden / Anzeigen der Symbolleiste:quelle
Das Ausblenden der Navigationsleiste nur auf der ersten Seite kann auch über das Storyboard erreicht werden. Gehen Sie im Storyboard zu Navigation Controller Scene-> Navigation Bar . Wählen Sie im Inspektor "Attribute " die Eigenschaft " Versteckt " . Dadurch wird die Navigationsleiste vom ersten Ansichtscontroller ausgeblendet, bis sie für den erforderlichen Ansichtscontroller sichtbar wird.
Die Navigationsleiste kann im ViewWillAppear-Rückruf von ViewController wieder sichtbar gemacht werden.
quelle
Swift 4:
In der Ansichtssteuerung möchten Sie die Navigationsleiste ausblenden.
quelle
Wenn Sie diesen Code in Ihrem ViewController implementieren, können Sie diesen Effekt erzielen. Der eigentliche Trick besteht darin, die Navigationsleiste beim Starten dieses Controllers auszublenden
und die Navigationsleiste einblenden, wenn der Benutzer diese Seite verlässt, ist viewWillDisappear
quelle