Alguém está tendo problemas com o simulador do iPhone X em torno do componente UITabBar?
O meu parece renderizar os ícones e o título um sobre o outro, não tenho certeza se estou perdendo alguma coisa, também o executei no simulador do iPhone 8 e em um dispositivo real em que ele parece bem, como mostrado na storyboard.
iPhone X:
iPhone 8
Respostas:
Consegui solucionar o problema simplesmente chamando invalidateIntrinsicContentSize na UITabBar em viewDidLayoutSubviews.
Nota: A parte inferior da barra de guias precisará estar contida na parte inferior da vista principal, em vez da área segura, e a barra de guias não deve ter restrição de altura.
fonte
[self.view layoutIfNeeded]
.landscapeImage
propriedade do botão da barra de guias. Os tamanhos recomendados estão em [Apple HIG's] ( developer.apple.com/design/human-interface-guidelines/ios/… ) em Tamanho personalizado do íconeA resposta fornecida pelo VoidLess corrige os problemas do TabBar apenas parcialmente. Ele corrige problemas de layout na barra de guias, mas se você usar o viewcontroller que oculta a barra de guias, a barra de guias é renderizada incorretamente durante as animações (para reproduzi-lo é melhor ter 2 segues - um modal e um push. Se você alternar os segues, poderá veja a barra de guias sendo renderizada fora do lugar). O código abaixo corrige os dois problemas. Bom trabalho apple.
Código Objective-C:
fonte
Existe um truque pelo qual podemos resolver o problema.
Isso realmente está funcionando para mim.
Ou você pode seguir este link para obter mais detalhes.
fonte
substituir
UITabBar
sizeThatFits(_)
por safeAreafonte
Adicionei isso ao
viewWillAppear
meu costumeUITabBarController
, porque nenhuma das respostas fornecidas funcionou para mim:fonte
Eu tive o mesmo problema.
Se eu definir qualquer constante diferente de zero na restrição inferior do UITabBar para a área segura:
Começa a funcionar como esperado ...
Essa é a única alteração que fiz e não tenho idéia do por que funciona, mas se alguém fizer, eu adoraria saber.
fonte
Mover a barra de guias 1 ponto para baixo funcionou para mim.
É claro que você terá uma lacuna ao fazê-lo, que precisará preencher de alguma forma, mas o texto / ícones agora estão posicionados corretamente.
fonte
Aha! É realmente mágico!
Finalmente descobri isso depois de horas amaldiçoando a Apple.
O UIKit realmente lida com isso para você, e parece que os itens alterados da barra de guias são devidos à configuração incorreta (e provavelmente um bug real do UIKit). Não há necessidade de subclassificação ou exibição em segundo plano.
O UITabBar "funcionará" apenas se estiver restrito ao fundo da superview, NÃO à área segura do fundo .
Até funciona no construtor de interfaces.
Configuração correta
Às vezes ainda não funciona
O que é realmente idiota é que você também pode ver o bug no IB, mesmo se adicionar as restrições exatas que o IB adiciona nas etapas acima!
fonte
Corrigido usando UITabBar subclassed para aplicar safeAreaInsets:
fonte
Resolvido para mim ligando
[tabController.view setNeedsLayout];
depois de descartar o modal no bloco de conclusão.fonte
O UITabBar está aumentando de altura para ficar acima do botão / linha inicial, mas desenha a subvisão em seu local original e sobrepõe o UITabBarItem sobre a subvisão.
Como solução alternativa, você pode detectar o iPhone X e reduzir a altura da visualização em 32px para garantir que a barra de guias seja exibida na área segura acima da linha inicial.
Por exemplo, se você estiver criando seu TabBar, substitua programaticamente
Com isso:
NOTA: Isso pode ser um bug, pois os tamanhos das visualizações e o layout da barra de guias são definidos pelo sistema operacional. Provavelmente, ele deve ser exibido conforme a captura de tela da Apple nas Diretrizes de interface humana do iPhone X aqui: https://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/
fonte
Meu caso foi que eu havia definido uma altura UITabBar personalizada no meu UITabBarController, assim:
A remoção desse código foi a solução para o TabBar ser exibido corretamente no iPhone X.
fonte
A solução mais simples que encontrei foi simplesmente adicionar um espaço de 0,2 pt entre a parte inferior da barra de guias e a parte inferior do safeAreaLayoutGuide.bottomAnchor dessa maneira.
fonte
Eu estava tendo o mesmo problema quando tentava definir o quadro do UITabBar no meu TabBarController personalizado.
Quando apenas o ajustei ao novo tamanho, o problema desapareceu
fonte
kPhoneXTabBarHeight
?Encontrei isso hoje com um UITabBar adicionado manualmente ao controlador de exibição no storyboard. Ao alinhar a parte inferior da área segura com uma constante de 0, eu obteria o problema, mas alterá-lo para 1 resolveria o problema. Ter o UITabBar acima de 1 pixel a mais do que o normal era aceitável para o meu aplicativo.
fonte
Eu arranhei minha cabeça com esse problema. Parece estar associado a como a tabBar é inicializada e adicionada para visualizar a hierarquia. Eu também tentei soluções acima, como chamar
invalidateIntrinsicContentSize
, definir o quadro e tambémbottomInsets
dentro de uma subclasse UITabBar. Eles parecem funcionar no entanto temporariamente e rompem com outro cenário ou regridem a barra de guias, causando algum problema de layout ambíguo. Quando estava depurando o problema, tentei atribuir as restrições de altura ao UITabBar e ao centerYAnchor, mas nenhum deles resolveu o problema. Percebi no depurador de exibição que a altura da tabBar estava correta antes e depois da reprodução do problema, o que me levou a pensar que o problema estava nas subvisões. Usei o código abaixo para corrigir com êxito esse problema sem regredir nenhum outro cenário.Pressupostos: estou fazendo isso apenas no iPhone X, pois ele não parece ser reproduzido em nenhum outro dispositivo no momento. É baseado no pressuposto de que a Apple não altera o nome da classe UITabBarButton em versões futuras do iOS. Estamos fazendo isso no UITabBarButton apenas quando significa que, se a apple adicionar mais subvisões internas ao UITabBar, talvez seja necessário modificar o código para ajustar isso.
Deixe-me saber se isso funciona, estará aberto a sugestões e melhorias!
Deve ser simples criar um equivalente rápido para isso.
fonte
viewDidAppear(animated:)
meuUITabBarController
e funcionou bem. Obrigado!Neste tutorial:
https://github.com/eggswift/ESTabBarController
e após a inicialização da barra de guias, escrevendo esta linha na classe appdelegate
Resolve meu problema de barra de guias.
Espero que isso resolva seu problema
obrigado
fonte
Marque a barra de guias e defina a caixa de seleção "Salvar margens relativas da área" no Inspector Editor da seguinte forma:
fonte
Eu tive o problema semelhante, no início ele foi renderizado corretamente, mas após a instalação
badgeValue
em um dos tabBarItem, ele quebrou o layout. O que funcionou para mim sem subclassificarUITabBar
foi isso, na minhaUITabBarController
subclasse já criada .Usei a visão geral tabBar para garantir que as restrições / âncoras estejam na mesma hierarquia de visualizações e evitar falhas.
Baseado no meu entendimento, como esse parece ser um bug do UIKit, precisamos reescrever / redefinir as restrições da barra de guias para que o mecanismo de layout automático possa fazer o layout da barra de guias novamente.
fonte
Se você tiver alguma restrição de altura para a barra de guias, tente removê-la.
Enfrentou o mesmo problema e removê-lo resolveu o problema.
fonte
Criei um novo UITabBarController no meu storyboard e enviei todos os controladores de exibição para esse novo UITabBarConttoller. Portanto, tudo funciona bem no simulador do iPhone X.
fonte
Para o iPhone, você pode fazer isso, subclasse UITabBarController.
Vá para o Storyboard e permita Use Use Safe Layout Layout Guide e altere a classe do UITabbarController para o para MyTabBarController
PS Esta solução não foi testada no caso de aplicação universal e iPad.
fonte
tente alterar a tela inicial com o tamanho @ 3x é (3726 × 6624)
fonte
Para mim, remova o
[self.tabBar setBackgroundImage:]
trabalho, talvez seja o bug do UIKitfonte
Para mim, isso corrigiu todos os problemas:
fonte
Eu estava usando um
UITabBarController
no storyboard e no começo estava funcionando bem para mim, mas depois de atualizar para a versão mais recente do Xcode, ele começou a me dar problemas relacionados à altura da tabBar.Para mim, a correção foi excluir o existente
UITabBarController
do storyboard e recriar, arrastando-o da biblioteca de objetos do construtor de interface .fonte
Para quem escreve todo
UITabBarController
programaticamente, você pode usarUITabBarItem.appearance().titlePositionAdjustment
para ajustar a posição do títuloPortanto, nesse caso, você deseja adicionar um espaço entre o ícone e o título, use-o em
viewDidLoad
:detectando se o dispositivo possui uma tela Notch:
fonte
Eu estava tendo o mesmo problema que foi resolvido definindo os itens da tabBar após o layout da barra de guias.
No meu caso, o problema ocorreu quando:
fonte
Eu acho que este é um bug do UIKit do iPhoneX. porque funciona:
fonte
Eu acredito que você pode estar colocando a barra de guias no guia de layout seguro inferior. Provavelmente não é o que você deseja, pois a barra de guias parece fazer seus próprios cálculos para posicionar os itens da barra de guias com segurança na parte superior da linha inicial do iPhone X. Configure sua restrição inferior na parte superior da superview . Você deve observar que o layout está correto no iPhone X e em outros iPhones.
fonte