UITabbarController 隐藏标签栏破坏了安全区域布局

Posted

技术标签:

【中文标题】UITabbarController 隐藏标签栏破坏了安全区域布局【英文标题】:UITabbarController hide tab bar breaks safe area layout 【发布时间】:2018-09-17 16:45:54 【问题描述】:

我在解决自动布局问题时遇到了挫折。希望对这个问题有一些新的看法会更好地找到解决方案......

我在故事板文件中有一个 UITabBarController,在第一个视图控制器中有一个 MKMapView 和一个按钮:

按钮被限制在视图控制器的视图安全区域的底部。 MKMapView 受限于其父视图。到目前为止,这工作正常。

当我旋转手机时,问题就来了。在UITabBarController的viewWillTransitionToSize:withTransitionCoordinator:方法中,我调用[self.tabBar setHidden:(size.height < kMinViewSize)]是为了在视图高度太小时隐藏标签栏。

隐藏标签栏后,这是我得到的:

然后当我再次旋转回纵向模式时,标签栏会按原样取消隐藏,但布局再次搞砸了:

最后,如果我选择另一个选项卡,然后返回到地图选项卡,按钮将移回正确的位置。

我是否遗漏了一些明显的东西?提前感谢您的帮助!

【问题讨论】:

你确定你的约束是按照你说的那样设置的吗?在具有相同设置的快速演示项目中,一切都按预期工作。 谢谢安德烈。奇怪的。我一定在情节提要中搞砸了其他东西,因为约束绝对是正确的。我将尝试制作一个演示项目并比较两者。 尝试在 viewDidLayoutSubviews() 中调用 setNeedsLayout() 和 layoutIfNeeded() 之前都试过了。而刚才我发现了问题!我觉得自己像个傻瓜…… 【参考方案1】:

嗯,我想通了,这并不太明显。 self.tabBar setHidden: 调用包含在 [coordinator animateAlongsideTransition:] 的动画块中。我把动画块拿出来,一切正常。

感谢 Andre Slotta 的评论 - 如果故事板中没有的话,这至少帮助我意识到代码中有问题。

【讨论】:

【参考方案2】:

您可以通过重新排列约束以及设备旋转来做到这一点

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) 
coordinator.animate(alongsideTransition:  (_) in

        //code

     )  (_) in       
   

【讨论】:

以上是关于UITabbarController 隐藏标签栏破坏了安全区域布局的主要内容,如果未能解决你的问题,请参考以下文章

将 UINavigationController 添加到 UITabBarController 而不在所有视图中显示标签栏

使用 UITabBarController 的 JASidePanels

隐藏标签栏控制器

用动画隐藏导航控制器和标签栏控制器

隐藏导航栏和标签栏后 UICollectionView 框架发生变化

如果推送控制器隐藏标签栏,UISearchBar 会跳转