Я почесал голову над этой проблемой. Похоже, это связано с тем, как tabBar инициализируется и добавляется для просмотра иерархии. Я также попробовал вышеуказанные решения, такие как вызов invalidateIntrinsicContentSize
, установка фрейма, а также bottomInsets
внутри подкласса UITabBar. Тем не менее, они работают временно и нарушают какой-то другой сценарий или регрессируют на панель вкладок, вызывая неоднозначную проблему с макетом. Когда я отлаживал проблему, я пытался назначить ограничения по высоте для UITabBar и centerYAnchor, однако ни одна из них не устранила проблему. В отладчике я понял, что высота tabBar была правильной до и после воспроизведения проблемы, что привело меня к мысли, что проблема была в подпредставлениях. Я использовал приведенный ниже код, чтобы успешно решить эту проблему без регресса в любой другой сценарий.
- (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];
}];
}
}
Предположения: я делаю это только для iPhone X, поскольку в данный момент он не воспроизводится ни на одном другом устройстве. Основан на предположении, что Apple не изменит название класса UITabBarButton в будущих выпусках iOS. Мы делаем это на UITabBarButton только тогда, когда означает, что если Apple добавляет больше внутренних подпредставлений в UITabBar, нам может потребоваться изменить код, чтобы приспособиться к этому.
Пожалуйста, дайте мне знать, если это работает, будут открыты для предложений и улучшений!
Для этого должно быть просто создать быстрый эквивалент.