No novo aplicativo para iPhone iOS7 do Facebook, quando o usuário rola a tela, navigationBar
oculta-se gradualmente até um ponto em que desaparece completamente. Então, quando o usuário rola para baixo, ele navigationBar
se mostra gradualmente.
Como você implementaria esse comportamento? Estou ciente da seguinte solução, mas ela desaparece imediatamente e não está ligada à velocidade do gesto de rolagem do usuário.
[navigationController setNavigationBarHidden: YES animated:YES];
Espero que isso não seja duplicado, pois não tenho certeza da melhor maneira de descrever o comportamento de "expansão / contratação".
ios
iphone
objective-c
ios7
uinavigationbar
El Mocoso
fonte
fonte
Respostas:
A solução dada por @peerless é um ótimo começo, mas só inicia uma animação sempre que o arrastar começa, sem considerar a velocidade do pergaminho. Isso resulta em uma experiência mais picante do que no aplicativo do Facebook. Para corresponder ao comportamento do Facebook, precisamos:
Primeiro, você precisará da seguinte propriedade:
E aqui estão os
UIScrollViewDelegate
métodos:Você também precisará destes métodos auxiliares:
Para um comportamento ligeiramente diferente, substitua a linha que reposiciona a barra ao rolar (a entrada do
else
blocoscrollViewDidScroll
) por esta:Isso posiciona a barra com base na última porcentagem de rolagem, em vez de uma quantidade absoluta, o que resulta em um desbotamento mais lento. O comportamento original é mais parecido com o Facebook, mas eu também gosto desse.
Nota: Esta solução é apenas para iOS 7 ou superior. Certifique-se de adicionar as verificações necessárias se você estiver suportando versões mais antigas do iOS.
fonte
customView
.ScrollView
'scontentSize
é menor do quadro, a animação de deslizamento não funciona. Além disso, redefina o alfa de todos os itens de navegação para 1,0 polviewDidDisappear
.EDIT: Apenas para iOS 8 e superior.
Você pode tentar usar
Funciona para mim.
Se a sua codificação for rápida, você deverá usar desta maneira (em https://stackoverflow.com/a/27662702/2283308 )
fonte
Aqui está mais uma implementação: TLYShyNavBar v1.0.0 lançado!
Decidi fazer o meu próprio depois de experimentar as soluções fornecidas e, para mim, eles estavam com um desempenho ruim, tinham uma alta barreira de entrada e código da placa da caldeira ou faltavam a visualização da extensão abaixo da barra de navegação. Para usar esse componente, tudo que você precisa fazer é:
Ah, e é testado em batalha em nosso próprio aplicativo.
fonte
extendedLayoutIncludesOpaqueBars
foi definida comoYES
na minhaUICollectionViewController
Você pode dar uma olhada no meu GTScrollNavigationBar . Eu subclassifiquei UINavigationBar para fazer rolagem com base na rolagem de um UIScrollView.
Nota: Se você tiver uma barra de navegação OPAQUE, a visualização de rolagem deve EXPANDIR à medida que a barra de navegação fica ESCONDIDA. É exatamente isso que o GTScrollNavigationBar faz. (Assim como, por exemplo, Safari no iOS.)
fonte
O iOS8 inclui propriedades para ocultar a barra de navegação gratuitamente. Existe um vídeo da WWDC que o demonstra, procure por "Ver avanços do controlador no iOS 8".
Exemplo :
}
Outras propriedades:
Encontrado em http://natashatherobot.com/navigation-bar-interactions-ios8/
fonte
Eu tenho algum tipo de solução rápida e suja para isso. Não foram realizados testes detalhados, mas aqui está a ideia:
Essa propriedade manterá todos os itens na barra de navegação da minha classe UITableViewController
Na mesma classe UITableViewController eu tenho:
Isso é apenas para ios> = 7, é feio eu sei, mas é uma maneira rápida de conseguir isso. Quaisquer comentários / sugestões são bem-vindos :)
fonte
Isso funciona para iOS 8 e superior e garante que a barra de status ainda retenha seu plano de fundo
E se você quiser mostrar a barra de navegação ao tocar na barra de status, faça o seguinte:
fonte
Aqui está minha implementação: SherginScrollableNavigationBar .
Na minha abordagem, estou usando
KVO
para observarUIScrollView
o estado, portanto, não há necessidade de usar um delegado (e você pode usá-lo para o que precisar).fonte
Por favor, tente esta minha solução e deixe-me saber por que isso não é tão bom quanto as respostas anteriores.
fonte
Uma maneira de conseguir isso é o seguinte.
Registre seu controlador de exibição como o
UIScrollViewDelegate
seu,UITableView
por exemplo.De dentro dos
UIScrollViewDelegate
métodos, você pode obter o novo contentOffset e traduzir seuUINavigationBar
cima ou para baixo de acordo.A configuração do alfa das subvisões também pode ser feita com base em alguns valores de limite e fatores que você pode definir e calcular.
Espero que ajude!
fonte
Além da resposta de Iwburk, adicionei o seguinte para corrigir o problema alfa em barras de navegação não personalizadas e redefinir a barra de navegação no método viewWillDisappear:
fonte
Eu estava procurando uma solução que permitisse qualquer estilo e comportamento. Você notará que o comportamento de condensação da barra é diferente em muitos aplicativos diferentes. E, claro, a aparência da barra é totalmente diferente entre os aplicativos.
Criei uma solução para esse problema com https://github.com/bryankeller/BLKFlexibleHeightBar/
Você pode definir suas próprias regras de comportamento para controlar como e quando a barra diminui e cresce, e pode definir exatamente como deseja que as subvisões da barra reajam à condensação ou crescimento da barra.
Dê uma olhada no meu projeto, se você quiser muita flexibilidade para criar qualquer tipo de barra de cabeçalho que possa imaginar.
fonte
Eu estava tentando emular esse comportamento em uma situação em que precisava de um cabeçalho personalizado sobre um UITableView. Eu rolei minha própria barra de "navegação" porque esta fica abaixo de várias outras coisas na página e eu queria que os cabeçalhos das seções seguissem o comportamento padrão de "encaixe". Acho que encontrei uma maneira bastante inteligente e sucinta de ajustar um UITableView / UIScrollView junto com outro objeto em um estilo semelhante ao visto no Facebook / Instagram / Chrome / etc. aplicativos.
No meu arquivo .xib, tenho meus componentes carregados em uma exibição de forma livre: http://imgur.com/0z9yebJ (desculpe, não tenha o representante para imagens embutidas)
Observe que, na barra lateral esquerda, a tabela está ordenada atrás da visualização principal do cabeçalho. Você não pode distinguir da captura de tela, mas ela também tem a mesma posição y da visualização principal do cabeçalho. Como se estende para fora da vista, a propriedade contentInset no UITableView é definida como 76 (a altura da exibição principal do cabeçalho).
Para fazer com que a visualização do cabeçalho principal deslize para cima em uníssono com o UIScrollView, eu uso os métodos scrollViewDidScroll do UIScrollViewDelegate para executar alguns cálculos e alterar o contentInset do UIScrollView, bem como o quadro da visualização do cabeçalho principal.
A primeira instrução if faz a maior parte do trabalho pesado, mas eu tive que incluir as outras duas para lidar com situações em que o usuário está arrastando com força e os valores contentOffset iniciais enviados para scrollViewDidScroll estão fora do intervalo da primeira instrução if .
Em última análise, isso está funcionando muito bem para mim. Eu odeio carregar meus projetos com um monte de subclasses inchadas. Não posso falar se essa é a melhor solução em termos de desempenho (sempre hesitei em colocar qualquer código no scrollViewDidScroll desde que ele é chamado o tempo todo), mas a pegada de código é a menor que já vi em qualquer solução para esse problema e não envolve o aninhamento de um UITableView em um UIScrollView (a Apple recomenda isso na documentação e os eventos de toque acabam um pouco estranhos no UITableView). Espero que isso ajude alguém!
fonte
HidingNavigationBar, um ótimo projeto que oculta a barra de navegação e a barra de guias, se você desejar.
https://github.com/tristanhimmelman/HidingNavigationBar
fonte
Tentei implementar o GTScrollNavigationBar, mas meu aplicativo exigia que eu modificasse as restrições de layout automático. Decidi colocar um exemplo da minha implementação no GitHub, caso alguém mais tenha que fazer isso com o layout automático. O outro problema que tive com a maioria das outras implementações é que as pessoas não definem os limites da exibição de rolagem para evitar o efeito de rolagem de paralaxe que você cria enquanto rola e ajusta o tamanho da exibição de rolagem simultaneamente.
Confira JSCollapsingNavBarViewController se você precisar fazer isso com o layout automático. Incluí duas versões, uma apenas com a barra de navegação e outra com uma sub-barra abaixo da barra de navegação que é recolhida antes de ser recolhida.
fonte
Eu tentei dessa maneira, espero que ajude. basta implementar o código no método delegado e definir para a visualização / subvisualização desejada
fonte
Uma extensão da resposta de @Iwburk ... Em vez de alterar a origem da barra de navegação, eu precisava expandir / reduzir o tamanho da barra de navegação.
Ainda não funciona com o
stoppedScrolling
método, vou postar uma atualização quando a tiverfonte
Todas essas abordagens parecem muito complicadas ... Então, naturalmente, eu criei a minha:
fonte
frame
propriedade?Encontrei todas as respostas dadas no Objective-C. Esta é a minha resposta no Swift 3. Este é um código muito genérico e pode ser usado diretamente. Ele funciona com UIScrollView e UITableView.
A lógica de definir alfa para itens de navegação é copiada da resposta @ WayneBurkett e reescrita no Swift 3.
fonte