Pasek nawigacji pokaż / ukryj


158

Mam aplikację z paskiem nawigacyjnym składającym się z 2 przycisków na pasku. 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, na pasku nawigacji powinna pojawić się animacja, podobna do tej, którą można zobaczyć w galerii zdjęć iPhone'a.

Jak mogę to zrobić? Sugestie są zawsze mile widziane.

Odpowiedzi:


381

To nie jest coś, co można zmieścić w kilku wierszach kodu, ale jest to jedna z metod, która może Ci się przydać.

Aby ukryć pasek nawigacji:

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

Aby to pokazać:

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

Dokumentacja dotycząca tej metody jest dostępna tutaj .

Aby nasłuchiwać „dwukrotnego kliknięcia” lub podwójnego dotknięcia, podklasę UIViewi utwórz instancję tej podklasy jako viewwłaściwość kontrolera widoku .

W podklasie widoku zastąp jej -touchesEnded:withEvent:metodę i policz, ile dotknięć uzyskasz w określonym czasie, mierząc czas między dwoma kolejnymi dotknięciami, być może z CACurrentMediaTime(). Lub przetestuj wynik z [touch tapCount].

Jeśli uzyskasz dwa dotknięcia, Twój podklasowy widok zgłasza błąd, NSNotificationktórego kontroler widoku zarejestrował do nasłuchiwania.

Gdy kontroler widoku usłyszy powiadomienie, uruchamia selektor, który ukrywa lub wyświetla pasek nawigacji przy użyciu wyżej wymienionego kodu, w zależności od bieżącego widocznego stanu paska nawigacji, do którego można uzyskać dostęp poprzez odczytanie właściwości paska nawigacji isHidden.

EDYTOWAĆ

Część mojej odpowiedzi dotycząca obsługi zdarzeń dotknięcia jest prawdopodobnie przydatna jeszcze przed iOS 3.1. Ta UIGestureRecognizerklasa jest obecnie prawdopodobnie lepszym podejściem do obsługi podwójnych dotknięć.

EDYCJA 2

Szybki sposób na ukrycie paska nawigacji to:

navigationController?.setNavigationBarHidden(true, animated: true)

Aby to pokazać:

navigationController?.setNavigationBarHidden(false, animated: true)

Jeśli jest to aplikacja do przeglądania zdjęć, ukrycie paska nawigacji powoduje nieprzyjemny skok widoku obrazu, któremu nie udało mi się zapobiec. 3.2 pozwala na użycie UIGestureRecognizer do podwójnego dotknięcia, co jest znacznie wygodniejszym podejściem (tylko dla iPada w bankomacie).
Paul Lynch,

Wielkie dzięki Alex, dostarczyłeś mi dużo informacji, będę postępować zgodnie z naszymi wytycznymi ..
wielkie

czy to samo dotyczy pasków kart ??? jeśli chcę ukryć / pokazać paski kart, czy co mam zrobić? pozdrowienia shishir
Shishir.bobby

1
Czy jest jakiś sposób, aby zapobiec temu „skokowi”, o którym wspomniał Paweł? Mam ten sam problem i nie wiem, co go powoduje… nie sądzę, nikt się na to nie natknął.
Icky

Aby zapobiec występowaniu `` skoku '', musisz zresetować właściwość contentInset widoku scrollview, jak wspomina jclee, po ukryciu / wyświetleniu paska nawigacji. to znaczy. self.scrollView.contentInset = UIEdgeInsetsZero
crafterm

17

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];
}
}

16

Najpierw przeczytaj sekcję w przewodniku programowania kontrolera widoku dla systemu iOS o „Przyjmowaniu układu pełnoekranowego dla widoków nawigacji” oraz sekcję o tym samym dla widoków niestandardowych. Jeśli próbujesz zrobić coś takiego jak Photos.app, 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 widoku przewijania z powrotem do zera (UIEdgeInsetsZero) zaraz po konfigurowanie początkowego stanu paska nawigacji i przed pojawieniem się widoku.

Następnie, jeśli masz jedno dotknięcie, które przełącza pasek nawigacji i / lub pasek stanu, aby pokazać lub ukryć, musisz zrobić dwie rzeczy w metodzie przełączania. Pierwsza wydaje się polegać na zapisaniu właściwości contentOffset widoku przewijania przed zmianą właściwości ukrytej NavigationBar i natychmiastowym przywróceniu zapisanej wartości do contentOffset. I ponownie wyzeruj właściwość contentInset na UIEdgeInsetsZero po zmianie właściwości navigationBarHidden. Ponadto, jeśli przełączasz pasek stanu, musisz zmienić jego stan, zanim zmienisz stan paska nawigacji.


1
Bardzo dziękuję za treść notatki contentOffset i contentInset. Jesteś prawdziwym bohaterem.
Altealice

Zgadzam się, jesteś tutaj prawdziwym bohaterem! Wielkie dzięki.
Gaetan

9

W Szybkim spróbuj tego,

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

lub

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

7

Aby ukryć pasek nawigacji:

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

Aby wyświetlić pasek nawigacji:

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

W iOS 7 funkcja autouzupełniania faktycznie promuje to rozwiązanie w przeciwieństwie do tego, które uzyskało najwięcej głosów.
Alex Zavatone

7

Oto bardzo szybkie i proste rozwiązanie:

self.navigationController.hidesBarsOnTap = YES;

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

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

Oto dokumentacja :


5

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

wprowadź opis obrazu tutaj


2

W Swift 4.2 i Xcode 10

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

Jeśli nie chcesz wyświetlać paska nawigacji tylko w pierwszym VC, ale chcesz wyświetlać go w drugim VC onword

W swoim 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

Jeśli chcesz wykryć stan paska nawigacji, czy jest on ukryty / pokazany. Możesz po prostu użyć następującego kodu, aby wykryć -

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


-4

KOD SWIFT: działa w pełni na 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
    }
}

1
Uważam, że jest to kiepskie rozwiązanie, dodanie gestu dotknięcia może, jeśli nie jest poprawnie skonfigurowany, usunąć gesty w innych widokach, takich jak UITableView lub UICollectionView. Sprawdzanie również, czy wartość logiczna == true jest zbędna i może skłonić innych programistów do myślenia, że ​​jest to dobra praktyka. W swoim przykładzie nadużywasz również wielbłąda i brakuje ci klamry końcowej. Pamiętaj, że selektory Swift 2.2 również zostały zaktualizowane. Lastly swift jest obsługiwany tylko na iOS 7 i nowszych i na pewno nie będzie działał na iOS 3.2
David Rees,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.