Pasek nawigacji Pokaż/Ukryj

Mam aplikację z paskiem nawigacyjnym składającym się z 2 przycisków paska. Chciałbym ukryć i pokazać ten pasek nawigacji, gdy użytkownik dwukrotnie dotknie ekranu.

Początkowo pasek nawigacji powinien być ukryty. Gdy użytkownik dwukrotnie dotknie ekranu, pasek nawigacji powinien wymyślić animację, taką jak to, co można zobaczyć w galerii zdjęć iPhone ' a.

Jak mogę coś takiego zrobić? Sugestie są zawsze mile widziane.

Author: Robotnik, 2010-05-28

11 answers

To nie jest coś, co może zmieścić się w kilku linijkach kodu, ale jest to jedno podejście, które może działać dla Ciebie.

Aby ukryć pasek nawigacji:

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

Aby pokazać:

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

Dokumentacja tej metody jest dostępna tutaj .

Aby nasłuchać "podwójnego kliknięcia" lub dwukrotnego stuknięcia, podklasa {[4] } i utworzyć instancję tej podklasy właściwością kontrolera widoku view.

W podklasie widok, nadpisuj jej -touchesEnded:withEvent: metoda i liczba ile dotknięć dostajesz w czasie, mierząc czas między dwoma kolejnymi dotknięciami, być może z CACurrentMediaTime(). Lub sprawdzić wynik z [touch tapCount].

Jeśli masz dwa stuknięcia, Twój podklasowany widok wydaje NSNotification że twój kontroler widoków zarejestrował się, aby nasłuchać.

Gdy kontroler widoku usłyszy powiadomienie, uruchomi selektor, który ukrywa lub pokazuje pasek nawigacyjny za pomocą wspomnianego kodu, w zależności od aktualny stan widoczny paska nawigacyjnego, Dostęp poprzez odczyt paska nawigacyjnego isHidden własność.

EDIT

Część mojej odpowiedzi do obsługi zdarzeń tap jest prawdopodobnie przydatna przed iOS 3.1. Na UIGestureRecognizer klasa jest prawdopodobnie lepszym podejściem do obsługi podwójnych kranów, w dzisiejszych czasach.

EDIT 2

Szybki sposób ukrycia paska nawigacyjnego to:

navigationController?.setNavigationBarHidden(true, animated: true)

Aby pokazać:

navigationController?.setNavigationBarHidden(false, animated: true)
 384
Author: Alex Reynolds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-15 09:16:55

Ten kod ci pomoże.

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];
}
}
 17
Author: Perjan Duro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-06 10:01:48

Najpierw przeczytaj sekcję w Przewodniku programowania kontrolera widoku dla systemu IOS o "przyjmowaniu układu pełnoekranowego dla widoków nawigacyjnych" i sekcję o tym samym dla widoków niestandardowych. Jeśli próbujesz zrobić coś takiego jak zdjęcia.aplikacja to prawdopodobnie używasz widoku przewijania. Zwróć uwagę na komentarz, że paski nawigacji automatycznie dodają wstawkę zawartości przewijania do widoku przewijania, aby uwzględnić wysokość paska nawigacji (i paska stanu), więc musisz zresetować właściwość contentInset przewijania widoku z powrotem do zera (UIEdgeInsetsZero) zaraz po ustawieniu początkowego stanu paska nawigacyjnego i przed pojawieniem się widoku.

Następnie, jeśli masz jedno dotknięcie, które przełącza pasek nawigacyjny i / lub pasek stanu, aby pokazać lub ukryć, musisz zrobić dwie rzeczy w metodzie przełączania. Pierwszym wydaje się być zapisanie właściwości contentOffset widoku przewijania przed zmianą ukrytej Właściwości paska nawigacyjnego i przywrócenie zapisanej wartości do contentOffset zaraz po tym. I drugi do ponownie Zeruj właściwość contentInset na uiedgeinsetszero po zmianie właściwości navigationBarHidden. Ponadto, jeśli przełączasz pasek stanu, musisz zmienić jego stan przed zmianą stanu paska nawigacyjnego.

 16
Author: jclee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-12 07:04:49

In Swift try this,

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

Lub

navigationController?.setNavigationBarHidden(true, animated: true) //Hide
navigationController?.setNavigationBarHidden(false, animated: true) //Show
 9
Author: Mohammad Zaid Pathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-15 09:17:51

Aby ukryć pasek nawigacji:

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

Aby wyświetlić pasek nawigacji:

[self.navigationController setNavigationBarHidden:NO animated:YES];
 7
Author: Jayprakash Dubey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-05 06:25:44

Oto bardzo szybkie i proste rozwiązanie:

self.navigationController.hidesBarsOnTap = YES;

Będzie to działać przy jednym dotknięciu zamiast podwójnego stuknięcia. Zmieni to również zachowanie kontrolera nawigacyjnego nawet po naciśnięciu lub naciśnięciu bieżącego kontrolera widoku.

Możesz zawsze zmodyfikować to zachowanie w kontrolerze w ramach akcji viewWillAppear: i viewwilldisappear:, jeśli chcesz ustawić zachowanie tylko dla jednego kontrolera widoku.

Oto dokumentacja :

 7
Author: amayer171292591,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-19 23:11:38

Jednym ze sposobów może być odznaczenie paska widoczności "pokazuje pasek nawigacji" w Inspektorze atrybutów.Mam nadzieję, że to komuś pomoże.

Tutaj wpisz opis obrazka

 5
Author: Avijit Nagare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-21 18:29:50

W Swift 4.2 i Xcode 10

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

Jeśli nie chcesz wyświetlać paska nawigacyjnego tylko w 1. VC, ale chcesz wyświetlać w 2. VC onword ' s

W Twoim pierwszym VC napisz ten kod.

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

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = false  //Show
}
 2
Author: iOS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-19 08:44:47

Jeśli chcesz wykryć stan paska nawigacyjnego to jest Ukryte / pokazane. Możesz po prostu użyć poniższego kodu do wykrycia -

if self.navigationController?.isNavigationBarHidden{
    print("Show navigation bar")
} else {
    print("hide navigation bar")
}
 2
Author: Mohammad Kamran Usmani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-21 08:58:30
 0
Author: theiOSDude,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-11 14:14:48

Kod SWIFT: działa w pełni dla systemu iOS 3.2 i nowszych.

  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)

Następnie napisz

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
    }
}
 -4
Author: Kwame 'oga' Yeboah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-08 10:26:13