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