Recentemente, baixei o Xcode 5 DP para testar meus aplicativos no iOS 7. A primeira coisa que notei e confirmei é que os limites da minha visualização nem sempre são redimensionados para dar conta da barra de status e da barra de navegação.
Em viewDidLayoutSubviews
, imprimo os limites da exibição:
{{0, 0}, {320, 568}}
Isso resulta no meu conteúdo aparecendo abaixo da barra de navegação e da barra de status.
Eu sei que eu poderia explicar a altura obtendo a altura da tela principal, subtraindo a altura da barra de status e a altura da barra de navegação, mas isso parece um trabalho extra desnecessário.
Como posso corrigir esse problema?
Atualizar:
Encontrei uma solução para esse problema específico. Defina a propriedade translúcida da barra de navegação como NO:
self.navigationController.navigationBar.translucent = NO;
Isso evitará que a exibição seja enquadrada embaixo da barra de navegação e da barra de status.
No entanto, não encontrei uma correção para o caso quando você deseja que a barra de navegação seja translúcida. Por exemplo, ao visualizar uma foto em tela cheia, desejo que a barra de navegação seja translúcida e a vista seja enquadrada embaixo dela. Isso funciona, mas quando alterno a exibição / ocultação da barra de navegação, experimentei resultados ainda mais estranhos. A primeira subvisão (um UIScrollView) obtém seus limites e a origem é alterada toda vez.
Respostas:
Você pode conseguir isso implementando uma nova propriedade chamada
edgesForExtendedLayout
no iOS7 SDK. Adicione o seguinte código para conseguir isso,Você precisa adicionar o acima em seu
-(void)viewDidLoad
método.Consulte, doc da apple
fonte
Você não precisa calcular até que ponto mudar tudo, há uma construção na propriedade para isso. No Construtor de interface, realce seu controlador de exibição e navegue até o inspetor de atributos. Aqui você verá algumas caixas de seleção ao lado das palavras "Estender arestas". Como você pode ver, na primeira captura de tela, a seleção padrão é para o conteúdo aparecer sob as barras superior e inferior, mas não sob as barras opacas, e é por isso que definir o estilo da barra como não translúcido funcionou para você.
Como você pode ver na primeira captura de tela, existem dois elementos da interface do usuário ocultos abaixo da barra de navegação. (Ativei os wireframes no IB para ilustrar isso) Esses elementos, um UIButton e um UISegmentedControl, têm sua origem "y" definida como zero, e o controlador de exibição está definido para permitir conteúdo abaixo da barra superior.
Esta segunda captura de tela mostra o que acontece quando você desmarca a caixa de seleção "Abaixo das barras superiores". Como você pode ver, a exibição dos controladores de exibição foi deslocada adequadamente para que sua origem y estivesse logo abaixo da barra de navegação.
Isso também pode ser realizado através de programação através do uso de
-[UIViewController edgesForExtendedLayout]
. Aqui está um link para a referência de classe para edgeForExtendedLayout e para UIRectEdgefonte
Criei minha visão programaticamente e isso acabou funcionando para mim:
Origem (na seção topLayoutGuide na parte inferior da página 39).
fonte
topLayoutGuide
é apenas iOS7.Solução Swift 3 / Swift 4 que também funciona com arquivos NIBs / XIB no iOS 10+:
fonte
Se você deseja que a exibição tenha a barra de navegação translúcida (o que é bastante legal), é necessário configurar um contentInset ou semelhante.
Aqui está como eu faço isso:
fonte
contentInset
é uma propriedade deUIScrollView
. E se minha visão principal não for uma subclasse deUIScrollView
. Então, como eu solucionaria o problema de sobreposição?edgesForExtendedLayout
faz o truque para o iOS 7. No entanto, se você criar o aplicativo no iOS 7 SDK e implantá-lo no iOS 6, a barra de navegação aparecerá translúcida e as visualizações ficarão abaixo. Portanto, para corrigi-lo no iOS 7 e no iOS 6, faça o seguinte:fonte
No arquivo plist dos aplicativos, adicione uma linha, chame-a de "Exibir aparência da barra de status com base no controlador" e defina-a como NÃO .
fonte
O truque mais simples é abrir o arquivo NIB e executar estas duas etapas simples:
E o resultado :
fonte
Solução rápida:
fonte
super.viewWillAppear(animated)
Gostaria de expandir a resposta de Stunner e adicionar uma
if
declaração para verificar se é o iOS-7, porque quando o testei no iOS 6, meu aplicativo falharia.A adição seria adicionar:
Então, eu sugiro adicionar este método ao seu
MyViewControler.m
arquivo:fonte
Swift 3
fonte
Eu tenho um cenário em que uso o BannerViewController escrito pela Apple para exibir meus anúncios e um ScrollViewController incorporado no BannerViewController.
Para impedir que a barra de navegação oculte meu conteúdo, tive que fazer duas alterações.
1) Modifique BannerViewController.m
2) Modifique meu ScrollViewContoller
Agora, os anúncios são exibidos corretamente na parte inferior da visualização, em vez de serem cobertos pela barra de navegação e o conteúdo na parte superior não é cortado.
fonte
basta definir o seguinte código em exibição aparecerá.
fonte
faça restrições ao layout superior como este
fonte
Swift 4.2 - Xcode 10.0 - iOS 12.0:
fonte
Para mim, a solução mais simples é adicionar duas chaves ao plist
fonte
Adicione a chave "Exibir aparência da barra de status baseada em controlador" na lista suspensa como uma linha em
info.plist
. Algo assim:fonte
Eu tive o mesmo problema com meu aplicativo por iPads (armv7, armv7s, amr64) apenas apresentando outro UIViewController e depois descartá-los na barra de status sob a barra de status ... passo muito tempo para encontrar qualquer solução para isso. Eu estou usando o storyboard e no InterfaceBuilder for UIViewController, o que torna terrível eu definir a Apresentação em tela cheia -> Contexto atual e corrigir esse problema. Funciona no meu aplicativo apenas para iPads => iOS8.0 (testando com iOS8.1) e para iPads com iOS 7.1 não funciona !!
fonte
Etapas para ocultar a barra de status no iOS 7:
1. Vá para o arquivo info.plist do aplicativo.
2.E definir, exibir a aparência da barra de status baseada em controlador: Booleano NÃO
Espero ter resolvido o problema da barra de status .....
fonte
No meu caso, tendo loadView () interrompido
este código: self.edgesForExtendedLayout = UIRectEdgeNone
mas depois de excluir o loadView () tudo funcionou bem
fonte