Navigationsleiste ein- / ausblenden


158

Ich habe eine App mit einer Navigationsleiste, die aus 2 Leistenschaltflächen besteht. Ich möchte diese Navigationsleiste ausblenden und anzeigen, wenn ein Benutzer zweimal auf den Bildschirm tippt.

Zunächst sollte die Navigationsleiste ausgeblendet sein. Wenn ein Benutzer zweimal auf den Bildschirm tippt, sollte in der Navigationsleiste eine Animation angezeigt werden, wie sie in der Fotogalerie des iPhones zu sehen ist.

Wie kann ich das machen? Vorschläge sind immer willkommen.

Antworten:


381

Dies kann nicht in einige Codezeilen passen, aber dies ist ein Ansatz, der für Sie möglicherweise funktioniert.

So blenden Sie die Navigationsleiste aus:

[[self navigationController] setNavigationBarHidden:YES animated:YES];

Um es zu zeigen:

[[self navigationController] setNavigationBarHidden:NO animated:YES];

Eine Dokumentation zu dieser Methode finden Sie hier .

Um auf einen "Doppelklick" zu warten oder zweimal zu tippen, unterklassifizieren Sie UIVieweine Unterklasse und machen Sie eine Instanz dieser Unterklasse zu der viewEigenschaft Ihres View Controllers .

Überschreiben -touchesEnded:withEvent:Sie in der Ansichtsunterklasse die Methode und zählen Sie, wie viele Berührungen Sie in einer bestimmten Zeit erhalten, indem Sie die Zeit zwischen zwei aufeinanderfolgenden Taps messen, möglicherweise mit CACurrentMediaTime(). Oder testen Sie das Ergebnis von [touch tapCount].

Wenn Sie zwei Taps erhalten, gibt Ihre untergeordnete Ansicht ein Problem aus, auf NSNotificationdas sich Ihr View Controller registriert hat, um zu warten.

Wenn Ihr Ansichts-Controller die Benachrichtigung hört, wird ein Selektor ausgelöst, der die Navigationsleiste mit dem oben genannten Code entweder ausblendet oder anzeigt. Dies hängt vom aktuellen sichtbaren Status der Navigationsleiste ab, auf den durch Lesen der isHiddenEigenschaft der Navigationsleiste zugegriffen wird .

BEARBEITEN

Der Teil meiner Antwort zur Behandlung von Tap-Ereignissen ist wahrscheinlich schon vor iOS 3.1 nützlich. Die UIGestureRecognizerKlasse ist heutzutage wahrscheinlich ein besserer Ansatz für den Umgang mit Doppelklicks.

BEARBEITEN 2

Der schnelle Weg, um die Navigationsleiste auszublenden, ist:

navigationController?.setNavigationBarHidden(true, animated: true)

Um es zu zeigen:

navigationController?.setNavigationBarHidden(false, animated: true)

Wenn dies für eine Photo Viewer-Anwendung gilt, führt das Ausblenden der Navigationsleiste zu einem unangenehmen Sprung in der Bildansicht, den ich nicht verhindern konnte. In 3.2 können Sie UIGestureRecognizer für Double Taps verwenden. Dies ist ein viel übersichtlicherer Ansatz (nur für iPad atm).
Paul Lynch

Vielen Dank Alex, du hast mir viele Informationen gegeben, ich werde deinen Richtlinien folgen.
Vielen

gilt das auch für Registerkartenleisten ??? Wenn ich Registerkarten ausblenden / anzeigen möchte, was muss ich tun? Grüße Shishir
Shishir.Bobby

1
Gibt es eine Möglichkeit, diesen von Paul erwähnten "Sprung" zu verhindern? Ich habe das gleiche Problem und ich weiß nicht, was es verursacht ... Ich glaube auch nicht, dass jemals jemand darauf gestoßen ist.
Icky

Um zu verhindern, dass der 'Sprung' auftritt, müssen Sie die contentInset-Eigenschaft der Bildlaufansicht zurücksetzen, wie von jclee erwähnt, nachdem Sie die Navigationsleiste ausgeblendet / angezeigt haben. dh. self.scrollView.contentInset = UIEdgeInsetsZero
crafterm

17

Dieser Code wird Ihnen helfen.

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] 
initWithTarget:self action:@selector(showHideNavbar:)];
[self.view addGestureRecognizer:tapGesture];

-(void) showHideNavbar:(id) sender 
{ 
// write code to show/hide nav bar here 
// check if the Navigation Bar is shown
if (self.navigationController.navigationBar.hidden == NO)
{
// hide the Navigation Bar
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
// if Navigation Bar is already hidden
else if (self.navigationController.navigationBar.hidden == YES)
{
// Show the Navigation Bar
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
}

16

Lesen Sie zuerst den Abschnitt im View Controller-Programmierhandbuch für iOS zum Thema "Übernehmen eines Vollbild-Layouts für Navigationsansichten" und den entsprechenden Abschnitt für benutzerdefinierte Ansichten. Wenn Sie versuchen, etwas wie die Photos.app zu machen, verwenden Sie wahrscheinlich eine Bildlaufansicht. Beachten Sie den Kommentar, dass Navigationsleisten Ihrer Bildlaufansicht automatisch einen Bildlaufinhaltseinsatz hinzufügen, um die Höhe der Navigationsleiste (und der Statusleiste) zu berücksichtigen, sodass Sie die contentInset-Eigenschaft Ihrer Bildlaufansicht unmittelbar danach auf Null (UIEdgeInsetsZero) zurücksetzen müssen Einrichten des Ausgangszustands der Navigationsleiste und bevor die Ansicht angezeigt wird.

Wenn Sie dann einmal tippen, um die Navigationsleiste und / oder die Statusleiste zum Ein- oder Ausblenden umzuschalten, müssen Sie bei Ihrer Umschaltmethode zwei Dinge tun. Die erste Möglichkeit besteht darin, die contentOffset-Eigenschaft der Bildlaufansicht zu speichern, bevor Sie die versteckte NavigationBar-Eigenschaft ändern und Ihren gespeicherten Wert direkt danach in contentOffset wiederherstellen. Und zweitens, um die contentInset-Eigenschaft nach dem Ändern der navigationBarHidden-Eigenschaft erneut auf UIEdgeInsetsZero zu setzen. Wenn Sie die Statusleiste umschalten, müssen Sie den Status ändern, bevor Sie den Status der Navigationsleiste ändern.


1
Vielen Dank für den Hinweis contentOffset und contentInset. Du bist der wahre Held.
Altealice

Ich stimme dir zu, du bist der wahre Held hier! Vielen Dank.
Gaetan

9

In Swift versuchen Sie dies,

navigationController?.isNavigationBarHidden = true  //Hide
navigationController?.isNavigationBarHidden = false //Show

oder

navigationController?.setNavigationBarHidden(true, animated: true) //Hide
navigationController?.setNavigationBarHidden(false, animated: true) //Show

7

So blenden Sie die Navigationsleiste aus:

[self.navigationController setNavigationBarHidden:YES animated:YES];

So zeigen Sie die Navigationsleiste an:

[self.navigationController setNavigationBarHidden:NO animated:YES];

In iOS 7 bewirbt die automatische Vervollständigung diese Lösung im Gegensatz zur am höchsten bewerteten.
Alex Zavatone

7

Hier ist eine sehr schnelle und einfache Lösung:

self.navigationController.hidesBarsOnTap = YES;

Dies funktioniert bei einfachem Tippen anstelle von doppeltem Tippen. Außerdem ändert sich das Verhalten des Navigationscontrollers auch nach dem Drücken oder Poppen des aktuellen Ansichtscontrollers.

Sie können dieses Verhalten in Ihrem Controller jederzeit in den Aktionen viewWillAppear: und viewWillDisappear: ändern, wenn Sie das Verhalten nur für einen einzelnen View-Controller festlegen möchten.

Hier ist die Dokumentation :


5

Eine Möglichkeit besteht darin, das Kontrollkästchen "Sichtbarkeit der Leiste" im Attributinspektor zu deaktivieren. Hoffen Sie, dass dies jemandem hilft.

Geben Sie hier die Bildbeschreibung ein


2

In Swift 4.2 und Xcode 10

self.navigationController?.isNavigationBarHidden = true  //Hide
self.navigationController?.isNavigationBarHidden = false  //Show

Wenn Sie die Navigationsleiste nicht nur im 1. VC anzeigen möchten, sondern im 2. VC-Onword anzeigen möchten

Schreiben Sie diesen Code in Ihre 1. VC.

override func viewWillAppear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = true  //Hide
}

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = false  //Show
}

2

Wenn Sie den Status der Navigationsleiste erkennen möchten, ob diese ausgeblendet oder angezeigt wird. Sie können einfach den folgenden Code verwenden, um zu erkennen:

if self.navigationController?.isNavigationBarHidden{
    print("Show navigation bar")
} else {
    print("hide navigation bar")
}


-4

SWIFT CODE: Dies funktioniert vollständig für iOS 3.2 und höher.

  override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")
    tapGesture.delegate = self
    self.view.addGestureRecognizer(tapGesture)

dann schreibe

func hideNavBarOntap() {
    if(self.navigationController?.navigationBar.hidden == false) {
        self.navigationController?.setNavigationBarHidden(true, animated: true) // hide nav bar is not hidden
    } else if(self.navigationController?.navigationBar.hidden == true) {
        self.navigationController?.setNavigationBarHidden(false, animated: true) // show nav bar
    }
}

1
Ich glaube, dies ist eine schlechte Lösung. Wenn Sie eine Tippgeste hinzufügen, können Sie Gesten in anderen Ansichten wie UITableView oder UICollectionView entfernen, wenn sie nicht richtig konfiguriert sind. Auch die Überprüfung, ob ein Boolescher Wert == true ist, ist redundant und kann andere Programmierer dazu veranlassen, zu glauben, dass dies eine gute Vorgehensweise ist. Sie missbrauchen auch Kamelkoffer und vermissen in Ihrem Beispiel eine Endstrebe. Denken Sie daran, dass auch schnelle 2.2-Selektoren aktualisiert wurden. Schließlich wird Swift nur unter iOS 7 und höher unterstützt und läuft definitiv nicht unter iOS 3.2
David Rees
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.