Barra de navegação mostrar / ocultar

158

Eu tenho um aplicativo com uma barra de navegação composta por 2 botões de barra. Gostaria de ocultar e mostrar esta barra de navegação quando um usuário tocar duas vezes na tela.

Inicialmente, a barra de navegação deve estar oculta. Quando um usuário toca duas vezes na tela, a barra de navegação deve aparecer uma animação, como o que pode ser visto na galeria de fotos do iPhone.

Como posso fazer algo assim? Sugestões são sempre apreciadas.

Shishir.bobby
fonte

Respostas:

381

Isso não é algo que pode se encaixar em algumas linhas de código, mas é uma abordagem que pode funcionar para você.

Para ocultar a barra de navegação:

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

Para mostrá-lo:

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

A documentação para este método está disponível aqui .

Para ouvir um "clique duplo" ou toque duas vezes, subclasse UIViewe faça com que uma instância dessa subclasse seja sua viewpropriedade do controlador de exibição .

Na subclasse de exibição, substitua seu -touchesEnded:withEvent:método e conte quantos toques você obtém em um período de tempo, medindo o tempo entre dois toques consecutivos, talvez com CACurrentMediaTime(). Ou teste o resultado em [touch tapCount].

Se você der dois toques, sua visualização em subclasse emitirá uma NSNotificationque seu controlador de visualização registrou para escutar.

Quando o seu controlador de exibição ouve a notificação, ele dispara um seletor que oculta ou mostra a barra de navegação usando o código mencionado acima, dependendo do estado visível atual da barra de navegação, acessado através da leitura da isHiddenpropriedade da barra de navegação .

EDITAR

A parte da minha resposta para lidar com eventos de toque provavelmente é útil antes do iOS 3.1. A UIGestureRecognizerclasse é provavelmente uma abordagem melhor para lidar com toques duplos hoje em dia.

EDIT 2

A maneira rápida de ocultar a barra de navegação é:

navigationController?.setNavigationBarHidden(true, animated: true)

Para mostrá-lo:

navigationController?.setNavigationBarHidden(false, animated: true)
Alex Reynolds
fonte
Se for para um aplicativo visualizador de fotos, ocultar a barra de navegação causa um salto desagradável na visualização da imagem, que não achei como evitar. O 3.2 permite que você use o UIGestureRecognizer para toques duplos, o que é uma abordagem muito mais organizada (apenas para o ATM no iPad).
Paul Lynch
Muito obrigado Alex, u forneceu-me um monte de infoemation, eu vou seguir as orientações ur .. Graças a tonelada
Shishir.bobby
é o mesmo aplicado para barras de tabulação ??? se eu quiser ocultar / mostrar barras de guias e o que eu devo fazer? relação Shishir
Shishir.bobby
1
Existe alguma maneira de impedir esse 'salto' que Paulo mencionou? Eu tenho o mesmo problema e não sei, o que o causa ... nem eu acho, ninguém nunca tropeçou nele.
Icky
Para impedir que o 'salto' ocorra, você deve redefinir a propriedade contentInset da visualização de rolagem, como jclee menciona, depois de ocultar / mostrar a barra de navegação. ie self.scrollView.contentInset = UIEdgeInsetsZero #
crafterm
17

Este código irá ajudá-lo.

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];
}
}
Perjan Duro
fonte
16

Leia primeiro a seção no Guia de programação do View Controller para iOS sobre 'Adotando um layout de tela inteira para exibições de navegação' e a seção sobre o mesmo para Exibições personalizadas. Se você está tentando fazer algo como o Photos.app, provavelmente está usando uma exibição de rolagem. Observe o comentário de que as barras de navegação adicionam automaticamente um conteúdo de rolagem inserido à sua exibição de rolagem para levar em conta a altura da barra de navegação (e barra de status); portanto, você deve redefinir a propriedade contentInset da exibição de rolagem para zero (UIEdgeInsetsZero) logo após configurando o estado inicial da barra de navegação e antes que a visualização apareça.

Então, se você tiver um único toque que alterna a barra de navegação e / ou a barra de status para mostrar ou ocultar, é necessário fazer duas coisas no método de alternância. A primeira parece ser salvar a propriedade contentOffset da exibição de rolagem antes de alterar a propriedade oculta NavigationBar e restaurar seu valor salvo para contentOffset logo depois. E, em seguida, zere novamente a propriedade contentInset para UIEdgeInsetsZero depois de alterar a propriedade navigationBarHidden. Além disso, se você estiver alternando a barra de status, precisará alterar seu estado antes de alterar o estado da barra de navegação.

jclee
fonte
1
Muito obrigado pelas notas contentOffset e contentInset. Você é o verdadeiro herói.
Altealice
Eu concordo, você é o verdadeiro herói, aqui! Muito obrigado.
Gaetan
9

No Swift, tente isso,

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

ou

navigationController?.setNavigationBarHidden(true, animated: true) //Hide
navigationController?.setNavigationBarHidden(false, animated: true) //Show
Mohammad Zaid Pathan
fonte
7

Para ocultar a barra de navegação:

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

Para mostrar a barra de navegação:

[self.navigationController setNavigationBarHidden:NO animated:YES];
Jayprakash Dubey
fonte
No iOS 7, o preenchimento automático promove realmente essa solução, em oposição à mais votada.
Alex Zavatone
7

Aqui está uma solução muito rápida e simples:

self.navigationController.hidesBarsOnTap = YES;

Isso funcionará no toque único em vez do toque duplo. Além disso, ele mudará o comportamento do controlador de navegação, mesmo depois de pressionar ou abrir o controlador de exibição atual.

Você sempre pode modificar esse comportamento no seu controlador dentro das ações viewWillAppear: e viewWillDisappear: se desejar definir o comportamento apenas para um único controlador de exibição.

Aqui está a documentação :

amayer171292591
fonte
5

Uma maneira seria desmarcar a barra Visibility "Shows Navigation Bar" no Attribute Inspector. Espero que isso ajude alguém.

insira a descrição da imagem aqui

Avijit Nagare
fonte
2

No Swift 4.2 e no Xcode 10

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

Se você não deseja exibir a barra de navegação apenas no 1º VC, mas deseja exibir no 2º VC onword's

No seu 1º VC escreva este código.

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

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

Se você deseja detectar o status da barra de navegação, ela está oculta / exibida. Você pode simplesmente usar o seguinte código para detectar -

if self.navigationController?.isNavigationBarHidden{
    print("Show navigation bar")
} else {
    print("hide navigation bar")
}
Mohammad Kamran Usmani
fonte
-4

CÓDIGO SWIFT: Funciona totalmente no iOS 3.2 e posterior.

  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)

então escreva

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
    }
}
Kwame 'oga' Yeboah
fonte
1
Acredito que esta é uma solução ruim, a adição de um gesto de toque pode, se não estiver configurada corretamente, remover gestos em outras visualizações, como UITableView ou UICollectionView. Também verificar se um booleano == true é redundante e pode levar outros programadores a pensar que essa é uma boa prática. Você também está usando mal a caixa de camelo e perdendo uma chave final no seu exemplo. Lembre-se de que os seletores rápidos do 2.2 também foram atualizados. Por último rápida é suportado apenas no iOS 7 e superior e definitivamente não será executado no iOS 3.2
David Rees