Najlepszym rozwiązaniem, jakie znalazłem, jest wykonanie następujących czynności w pierwszym kontrolerze widoku .
Cel C
- (void)viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:animated];
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated:animated];
[super viewWillDisappear:animated];
}
Szybki
override func viewWillAppear(animated: Bool) {
self.navigationController?.setNavigationBarHidden(true, animated: animated)
super.viewWillAppear(animated)
}
override func viewWillDisappear(animated: Bool) {
self.navigationController?.setNavigationBarHidden(false, animated: animated)
super.viewWillDisappear(animated)
}
Spowoduje to animację paska nawigacyjnego od lewej (wraz z następnym widokiem) po naciśnięciu następnego UIViewController
na stosie i animację od lewej (wraz ze starym widokiem) po naciśnięciu przycisku Wstecz na UINavigationBar
.
Należy również pamiętać, że nie są to metody delegowania, zastępujesz UIViewController
implementację tych metod i zgodnie z dokumentacją musisz wywołać implementację super w jakimś miejscu .
animated=YES
. Wiem, że wygląda brzydkoanimated=NO
, ale wydaje się, że gdy animacja ukrywania paska nawigacyjnego nie jest jeszcze ukończona, to animacja pokazująca ją ponownie jest ignorowana. Nie ma jeszcze rozwiązania.Innym podejściem, które znalazłem, jest ustawienie delegata dla
NavigationController
:i użyj
setNavigationBarHidden
wnavigationController:willShowViewController:animated:
Łatwy sposób na dostosowanie zachowania każdego z nich
ViewController
w jednym miejscu.źródło
Jednym drobnym drobiazgiem, który musiałem wprowadzić w innych odpowiedziach, jest jedynie odsłonięcie paska w widoku. Zniknie, jeśli przyczyną jego zniknięcia jest wciśnięcie na niego elementu nawigacyjnego. Jest tak, ponieważ widok może zniknąć z innych powodów.
Odsłoniłem pasek tylko wtedy, gdy ten widok nie jest już najwyższym widokiem:
źródło
Umieściłbym kod w widoku delegata viewWillAppear na każdym wyświetlanym widoku:
W ten sposób musisz go ukryć:
W ten sposób musisz to pokazać:
źródło
Aktualnie akceptowana odpowiedź nie pasuje do zamierzonego zachowania opisanego w pytaniu. Pytanie wymaga, aby pasek nawigacji był ukryty w kontrolerze widoku głównego, ale widoczny wszędzie indziej, ale zaakceptowana odpowiedź ukrywa pasek nawigacji w określonym kontrolerze widoku. Co się stanie, gdy inna instancja pierwszego kontrolera widoku zostanie wypchnięta na stos? Ukryje pasek nawigacji, mimo że nie patrzymy na kontroler widoku głównego.
Zamiast tego strategia korzystania z @Chad M.
UINavigationControllerDelegate
jest dobra, a tutaj jest bardziej kompletne rozwiązanie. Kroki:UINavigationController
-navigationController:willShowViewController:animated
metodę pokazywania lub ukrywania paska nawigacji w zależności od tego, czy pokazuje kontroler widoku głównegoPełny kod dla tego rozwiązania można znaleźć w tej Gist . Oto
navigationController:willShowViewController:animated
implementacja:źródło
w Swift 3:
źródło
navcontroller.navagationBarHidden
, spowoduje to uszkodzenie całego kontrolera nawigacyjnego (bez przeciągania tam i z powrotem). Aby to zadziałało, użyłemnavigationController?.navigationBar.hidden
zamiast tego. Przesuwanie nadal działa i nie pozostawia pustej przestrzeni, ponieważ wydaje się, że znajduje się w widoku stosu lub coś w tym styluUdzielam odpowiedzi @ chad-m.
Oto wersja Swift:
MyNavigationController.swift
Różnica między odpowiedzią chad-m a moją:
Dziedzicz po UINavigationController, więc nie zanieczyszczasz swojego rootViewController.
użyj
self.viewControllers.first
zamiasthomeViewController
, więc nie zrobisz tego 100 razy dla 100 UINavigationControllers w 1 StoryBoard.źródło
Po wielu próbach dowiedziałem się, jak działało to, czego chciałem. Właśnie tego próbowałem. - Mam widok ze zdjęciem. i chciałem, aby obraz był wyświetlany na pełnym ekranie. - Mam też kontroler nawigacji z paskiem tab. Więc też muszę to ukryć. - Moim głównym wymaganiem było nie tylko ukrywanie się, ale także efekt zanikania podczas pokazywania i ukrywania się.
Tak to działało.
Krok 1 - Mam obraz i użytkownik stuknie go raz. Przechwytuję ten gest i wpycham go w nowy
imageViewController
, w tymimageViewController
, chcę mieć obraz na pełnym ekranie.Krok 2 - Wszystkie poniższe kroki znajdują się w ImageViewController
Krok 2.1 - W ViewDidLoad pokaż pasek nawigacyjny
Krok 2.2 - W
viewDidAppear
ustaw zadanie timera z opóźnieniem (mam ustawione na 1 sekundę opóźnienia). A po opóźnieniu dodaj efekt zanikania. Korzystam z alfa, aby używać zanikania.krok 2.3 - Pod
viewWillAppear
dodaj gest singleTap do obrazu i uczyń pasek nawigacyjny przezroczystym.Krok 3 - Na koniec
viewWillDisappear
pamiętaj, aby odłożyć wszystkie rzeczy z powrotemźródło
W przypadku, gdy ktoś nadal ma problem z szybkim usunięciem wstecznego błędu, anulował błąd, ponieważ @fabb skomentował w zaakceptowanej odpowiedzi.
Udaje mi się to naprawić, zastępując
viewDidLayoutSubviews
dodatkowo,viewWillAppear/viewWillDisappear
jak pokazano poniżej:W moim przypadku zauważam, że dzieje się tak, ponieważ kontroler widoku głównego (gdzie nav jest ukryty) i kontroler widoku wypychanego (nav jest pokazany) ma różne style paska stanu (np. Ciemny i jasny). W momencie rozpoczęcia przeciągnięcia wstecz w celu otwarcia kontrolera widoku pojawi się dodatkowa animacja kolorowa paska stanu. Jeśli zwolnisz palec w celu anulowania interaktywnego popu, a animacja paska stanu nie zostanie zakończona , pasek nawigacyjny zniknie na zawsze!
Ten błąd nie występuje jednak, jeśli style paska stanu obu kontrolerów widoku są takie same.
źródło
Jeśli chcesz całkowicie ukryć pasek nawigacji w kontrolerze, o wiele czystszym rozwiązaniem jest, aby w kontrolerze głównym mieć coś takiego:
Po naciśnięciu widoku potomnego w kontrolerze pasek nawigacji pozostanie ukryty; jeśli chcesz wyświetlić go tylko w dziecku, dodasz kod do wyświetlania
it(self.navigationController.navigationBarHidden=NO;)
wviewWillAppear
wywołaniu zwrotnym i podobnie kod do ukrywania go naviewWillDisappear
źródło
Najprostszą implementacją może być po prostu sprawdzenie, czy każdy kontroler widoku określa, czy jego pasek nawigacji jest ukryty czy nie w swojej
viewWillAppear:animated:
metodzie. To samo podejście działa również w przypadku ukrywania / pokazywania paska narzędzi:źródło
Ukrywanie paska nawigacyjnego tylko na pierwszej stronie można uzyskać również poprzez scenorys. W serii ujęć goto Navigation Controller Scene-> Pasek nawigacji . I wybierz właściwość „ Ukryty ” w Inspektorze atrybutów . To ukryje pasek nawigacyjny od pierwszego kontrolera widoku, aż stanie się widoczny dla wymaganego kontrolera widoku.
Pasek nawigacji można ustawić ponownie tak, aby był widoczny w wywołaniu zwrotnym ViewWillAppear ViewControllera.
źródło
Swift 4:
W kontrolerze widoku, przed którym chcesz ukryć pasek nawigacji.
źródło
Wdrażając ten kod w ViewController, możesz uzyskać ten efekt. Właściwie sztuczka polega na tym, że ukryj pasek nawigacji po uruchomieniu tego kontrolera.
i odsłoń pasek nawigacji, gdy użytkownik opuści tę stronę, to viewWillDisappear
źródło