Eu sei que a presença do controlador de mais view (barra de navegação) empurra o UIView pela sua altura. Eu também sei que essa altura = 44px. Eu também descobri que esse push down mantém o [self.view].frame.origin.y = 0
.
Então, como eu determino a altura dessa barra de navegação, além de configurá-la para uma constante?
Ou, versão mais curta, como determino que meu UIView está sendo exibido com a barra de navegação na parte superior?
A lâmpada começou a acender. Infelizmente, não descobri uma maneira uniforme de corrigir o problema, conforme descrito abaixo.
Acredito que todo o meu problema esteja centrado nas minhas autoresizingMasks. E a razão pela qual concluí que existem os mesmos sintomas, com ou sem um UIWebView. E esse sintoma é que tudo é pêssego para o Portrait. Para Paisagem, o UIButton mais abaixo aparece atrás da TabBar.
Por exemplo, em um UIView, eu tenho, de cima para baixo:
UIView - ambas as molas definidas (caso padrão) e sem suportes
UIScrollView - Se eu definir as duas molas e limpar tudo o resto (como o UIView), o UIButton entrará no objeto imediatamente acima dele. Se eu limpar tudo, o UIButton está OK, mas as coisas na parte superior se escondem atrás da Configuração da barra de status, apenas a parte superior, o UIButton aparece atrás da barra de guias.
UILabel e UIImage a seguir na vertical - conjunto superior de suporte, flexível em qualquer outro lugar
Apenas para concluir a imagem para os poucos que têm um UIWebView:
UIWebView - Struts: superior, esquerda, direita Molas: ambas
UIButton - nada definido, ou seja, flexível em qualquer lugar
Embora minha lâmpada esteja fraca, parece haver esperança.
Por favor, tenha paciência comigo, porque eu precisava de mais espaço do que o previsto para uma resposta curta.
Obrigado por tentar entender o que eu realmente estou pescando ... então aqui vai.
1) Cada UIViewController (um aplicativo TabBar) possui uma UIImage, algum texto e o que estiver no topo. Outro denominador comum é um UIButton na parte inferior. Em alguns dos UIViewControllers, tenho um UIWebView acima do UIButton.
Então, UIImage, texto etc. UIWebView (em ALGUNS) UIButton
Ao redor de todo o exposto, há um UIScrollView.
2) Para aqueles que possuem um UIWebView, seu autoresizingMask se parece com:
—
|
—
^
|
|
| - | ← ---- → | - | | | V A máscara do UIButton não tem nada definido, ou seja, flexível em qualquer lugar
No meu -viewDidLoad, chamo meu -repositionSubViews no qual faço o seguinte:
Se não houver UIWebView, não faço nada, exceto centralizar o UIButton que coloquei com o IB.
Se eu tiver um UIWebView, determinarei sua altura * content * e defino seu quadro para incluir todo o conteúdo.
UIScrollView *scrollViewInsideWebView = [[webView_ subviews] lastObject];
webViewContentHeight = scrollViewInsideWebView.contentSize.height;
[webView_ setFrame:CGRectMake(webViewOriginX, webViewOriginY,
sameWholeViewScrollerWidth, webViewContentHeight)]
Depois de fazer isso, empurro programaticamente o UIButton para baixo, para que ele fique abaixo do UIWebView.
Tudo funciona, até eu girá-lo de Retrato para Paisagem.
Eu chamo meu -repositionSubViews dentro do meu -didRotateFromInterfaceOrientation.
Por que a altura do conteúdo do meu UIWebView não muda com a rotação?
De Retrato para Paisagem, a largura do conteúdo deve expandir e a altura do conteúdo deve diminuir. Faz visualmente como deveria, mas não de acordo com o meu NSLog.
De qualquer forma, com ou sem um UIWebView, o botão sobre o qual eu falei se move abaixo da Barra de Tabulação no modo Paisagem, mas ele não rola para cima para ser visto. Eu o vejo por trás da TabBar quando rolar "vigorosamente", mas depois "retrocede" por trás da TabBar.
Resumindo, esse último é o motivo pelo qual perguntei sobre a altura do TabBar e do NavigationBar porque o TabBar se planta na parte inferior do UIView e o NavigationBar empurra o UIView para baixo.
Agora, adicionarei um ou dois comentários aqui, porque eles não teriam sentido antes.
Sem o UIWebView, deixo tudo como é visto pelo IB.
Com um UIWebView, aumento o frame.height do UIWebView para o contentHeight e também ajusto a altura do UIScrollView circundante que envolve todas as sub-visualizações.
Bem, aí está.
Com o iPhone-X, a altura da barra superior (barra de navegação + barra de status) é alterada (aumentada).
Tente isso se desejar a altura exata da barra superior (barra de navegação + barra de status):
ATUALIZAR
iOS 13
Como o
statusBarFrame
foi reprovado,iOS13
você pode usar o seguinte:Objetivo-C
Swift 4
Para facilitar, tente esta extensão UIViewController
Swift 3
fonte
Versão rápida :
fonte
Você tentou isso?
fonte
Suporte iOS 13 e abaixo:
fonte
Então, tudo o que realmente precisamos é
fonte
Meu aplicativo possui algumas visualizações que exigiam uma barra de navegação personalizada na interface do usuário para a aparência, porém sem o controlador de navegação. E o aplicativo é necessário para oferecer suporte à versão iOS anterior ao iOS 11, para que o guia prático de layout de área segura não possa ser usado, e eu tenho que ajustar a posição e a altura da barra de navegação programaticamente.
Anexei a barra de navegação à sua visão geral diretamente, pulando o guia de layout da área segura, como mencionado acima. E a altura da barra de status pode ser recuperada facilmente do UIApplication, mas a altura padrão da barra de navegação é realmente um problema ...
Fiquei impressionado por quase meia noite, com várias pesquisas e testes, até que finalmente recebi a dica de outro post (embora não funcionasse para mim), que você poderia realmente obter a altura de UIView.sizeThatFits (), assim: :
Finalmente, uma barra de navegação perfeita parecendo exatamente a mesma que a embutida!
fonte
Se você deseja obter
navigationBar
apenas a altura, é simples:No entanto, se você precisar da altura do topo do iPhone, não precisará obter a
navigationBar
altura e adicioná-la àstatusBar
altura, basta ligarsafeAreaInsets
para isso.fonte
A lâmpada começou a acender. Infelizmente, não descobri uma maneira uniforme de corrigir o problema, conforme descrito abaixo.
Acredito que todo o meu problema esteja centrado nas minhas autoresizingMasks. E a razão pela qual concluí que existem os mesmos sintomas, com ou sem um UIWebView. E esse sintoma é que tudo é pêssego para o Portrait. Para Paisagem, o UIButton mais abaixo aparece atrás da TabBar.
Por exemplo, em um UIView, eu tenho, de cima para baixo:
UIView - ambas as molas definidas (caso padrão) e sem suportes
UIScrollView - Se eu definir as duas molas e limpar tudo o resto (como o UIView), o UIButton entrará no objeto imediatamente acima dele. Se eu limpar tudo, o UIButton está OK, mas as coisas na parte superior se escondem atrás da Configuração da barra de status, apenas a parte superior, o UIButton aparece atrás da barra de guias.
UILabel e UIImage a seguir na vertical - conjunto superior de suporte, flexível em qualquer outro lugar
Apenas para concluir a imagem para os poucos que têm um UIWebView:
UIWebView - Struts: superior, esquerda, direita Molas: ambas
UIButton - nada definido, ou seja, flexível em qualquer lugar
Embora minha lâmpada esteja fraca, parece haver esperança.
fonte
Aqui está o começo da minha resposta à sua atualização:
Poderia ser porque o redimensionamento automático não possui a autoresizingMask para todas as direções?
Outra sugestão antes de eu voltar para isso, você pode usar uma barra de ferramentas para suas necessidades. É um pouco mais simples, sempre estará na parte inferior, gira / posiciona automaticamente. Você pode ocultar / mostrar à vontade, etc. Assim: http://cdn.artoftheiphone.com/wp-content/uploads/2009/01/yellow-pages-iphone-app-2.jpg
Você pode ter olhado para essa opção, mas apenas lançando-a por aí.
Outra idéia: você poderia detectar de que orientação está girando e basta colocar o botão programaticamente para ajustar a barra de guias. (Isso é possível com o código)
fonte
Eu tenho usado:
Funcionando muito bem se você deseja obter a altura da barra de navegação E sua origem Y.
fonte
Swift 5
Se você também deseja considerar o safeArea:
fonte
Handy Swift 4, caso seja útil para outra pessoa. Funciona mesmo se o controlador de exibição atual não exibir uma barra de navegação.
Uso:
fonte