A melhor solução que encontrei é fazer o seguinte no primeiro controlador de exibição .
Objetivo-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];
}
Rápido
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)
}
Isso fará com que a barra de navegação seja animada da esquerda (junto com a próxima exibição) quando você empurra a próxima UIViewController
na pilha e animada para a esquerda (junto com a exibição antiga), quando você pressiona o botão voltar na UINavigationBar
.
Observe também que esses não são métodos delegados, você está substituindo UIViewController
a implementação desses métodos e, de acordo com a documentação, deve chamar a implementação do super em algum lugar da sua implementação .
animated=YES
. Eu sei que parece feioanimated=NO
, mas parece que quando a animação para ocultar a barra de navegação ainda não está concluída, a animação para mostrá-la novamente é ignorada. Ainda não há solução.Outra abordagem que encontrei é definir um delegado para
NavigationController
:e usar
setNavigationBarHidden
emnavigationController:willShowViewController:animated:
Maneira fácil de personalizar o comportamento de cada
ViewController
um em um só lugar.fonte
Um pequeno ajuste que eu tive que fazer nas outras respostas é mostrar apenas a barra no viewWillDisappear se o motivo pelo qual está desaparecendo se deve ao fato de um item de navegação ser pressionado nela. Isso ocorre porque a exibição pode desaparecer por outros motivos.
Então, só mostro a barra se essa visualização não for mais a mais alta:
fonte
Eu colocaria o código no delegado viewWillAppear em cada modo de exibição mostrado:
Assim, onde você precisa escondê-lo:
Assim, onde você precisa mostrá-lo:
fonte
A resposta atualmente aceita não corresponde ao comportamento pretendido descrito na pergunta. A pergunta solicita que a barra de navegação fique oculta no controlador de exibição raiz, mas visível em qualquer outro lugar, mas a resposta aceita oculta a barra de navegação em um controlador de exibição específico. O que acontece quando outra instância do primeiro controlador de exibição é colocada na pilha? Ele ocultará a barra de navegação, mesmo que não estejamos olhando para o controlador de visualização raiz.
Em vez disso, a estratégia de @Chad M. de usar o
UINavigationControllerDelegate
é boa e aqui está uma solução mais completa. Passos:UINavigationController
-navigationController:willShowViewController:animated
método para mostrar ou ocultar a barra de navegação com base em se está mostrando o controlador de visualização raizO código completo para esta solução pode ser encontrado nesta lista . Aqui está a
navigationController:willShowViewController:animated
implementação:fonte
no Swift 3:
fonte
navcontroller.navagationBarHidden
ele quebrará todo o controlador de navegação (sem passar para frente e para trás). Para fazê-lo funcionar, eu useinavigationController?.navigationBar.hidden
. Passando ainda funciona e não deixar espaço vazio, porque parece estar dentro de um stackview ou algoDê meu crédito à resposta de @ chad-m.
Aqui está a versão Swift:
MyNavigationController.swift
Diferença entre a resposta de chad-m e a minha:
Herdar de UINavigationController, para que você não polua seu rootViewController.
use em
self.viewControllers.first
vez dehomeViewController
, então você não fará isso 100 vezes para seus 100 UINavigationControllers em 1 StoryBoard.fonte
Após vários testes, aqui está como eu consegui que funcionasse para o que queria. Era isso que eu estava tentando. - Eu tenho uma visão com uma imagem. e eu queria que a imagem ficasse em tela cheia. - Eu tenho um controlador de navegação com uma tabBar também. Então eu preciso esconder isso também. - Além disso, meu principal requisito não era apenas ocultar, mas também ter um efeito de desbotamento ao mostrar e ocultar.
Foi assim que eu consegui funcionar.
Etapa 1 - Eu tenho uma imagem e o usuário toca nessa imagem uma vez. Capto esse gesto e o empurro para o novo
imageViewController
, é noimageViewController
, quero ter uma imagem em tela cheia.Etapa 2 - Todas essas etapas abaixo estão no ImageViewController
Etapa 2.1 - No ViewDidLoad, mostre a navBar
Etapa 2.2 - In
viewDidAppear
, configure uma tarefa de timer com atraso (eu tenho isso definido para 1 segundo de atraso). E após o atraso, adicione efeito de desbotamento. Eu estou usando alfa para usar desbotamento.passo 2.3 - Abaixo
viewWillAppear
, adicione um gesto de toque único à imagem e torne a navBar translúcida.Etapa 3 - Finalmente
viewWillDisappear
, certifique-se de colocar todas as coisas de voltafonte
Caso alguém ainda tenha problemas com o bug rápido de retrocesso cancelado, como o @fabb comentou na resposta aceita.
Consigo corrigir isso substituindo
viewDidLayoutSubviews
, além doviewWillAppear/viewWillDisappear
mostrado abaixo:No meu caso, noto que é porque o controlador de visualização raiz (onde nav está oculto) e o controlador de visualização pressionado (nav é mostrado) têm estilos diferentes de barra de status (por exemplo, escuro e claro). No momento em que você inicia o retrocesso para abrir o controlador de exibição, haverá animação adicional em cores na barra de status. Se você soltar o dedo para cancelar o pop interativo, enquanto a animação da barra de status não estiver concluída , a barra de navegação desaparecerá para sempre!
No entanto, esse erro não ocorre se os estilos da barra de status dos dois controladores de exibição forem os mesmos.
fonte
Se o que você deseja é ocultar completamente a barra de navegação no controlador, uma solução muito mais limpa é, no controlador raiz, ter algo como:
Quando você pressiona uma exibição filho no controlador, a Barra de Navegação permanece oculta; se você quiser exibi-lo apenas na criança, você adicionará o código para exibir
it(self.navigationController.navigationBarHidden=NO;)
noviewWillAppear
retorno de chamada e, da mesma forma, o código para ocultá-loviewWillDisappear
fonte
A implementação mais simples pode ser apenas fazer com que cada controlador de exibição especifique se sua barra de navegação está oculta ou não em seu
viewWillAppear:animated:
método. A mesma abordagem funciona bem para ocultar / mostrar a barra de ferramentas também:fonte
Ocultar a barra de navegação somente na primeira página também pode ser conseguida através do storyboard. No storyboard, vá para Navigation Controller Scene-> Navigation Bar . E selecione a propriedade ' Oculto ' no inspetor Atributos . Isso ocultará a barra de navegação, iniciando do primeiro viewcontroller até que fique visível para o viewcontroller necessário.
A barra de navegação pode ser configurada novamente como visível no retorno de chamada ViewWillAppear do ViewController.
fonte
Swift 4:
No controlador de exibição do qual você deseja ocultar a barra de navegação.
fonte
Ao implementar esse código no seu ViewController, você pode obter esse efeito. Na verdade, o truque é ocultar a barra de navegação quando o controlador for iniciado.
e reexibir a barra de navegação quando o usuário sair dessa página, faça isso: viewWillDisappear
fonte