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ém bottomInsets
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.
- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
if (DEVICE_IS_IPHONEX())
{
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
for (UIView *view in self.tabBar.subviews)
{
if ([NSStringFromClass(view.class) containsString:@"UITabBarButton"])
{
if (@available (iOS 11, *))
{
[view.bottomAnchor constraintEqualToAnchor:view.superview.safeAreaLayoutGuide.bottomAnchor].active = YES;
}
}
}
} completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
[self.tabBar layoutSubviews];
}];
}
}
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.