在 iOS 中的 navigationController 堆栈中隐藏 tabBar 时,视图在屏幕上显示后向下移动

Posted

技术标签:

【中文标题】在 iOS 中的 navigationController 堆栈中隐藏 tabBar 时,视图在屏幕上显示后向下移动【英文标题】:view shifts down after being presented on screen when hiding tabBar in a navigationController stack in iOS 【发布时间】:2015-11-27 07:07:37 【问题描述】:

我试图在推送到新的 viewController 时隐藏我的 tabBar。我通过在情节提要中的 Push 上勾选 Hide Bottom Bar 来实现这一点。问题在于,在向下移动到正确位置之前,被推送到的新视图会暂时显示它的原始位置(好像 tabBar 还在那里)。

搜索了一段时间后,我发现了一个类似的帖子: Auto Layout and "Hide bottom bar when pushed"

不幸的是,选择新视图的底部约束到底部布局指南的解决方案。底部在 ios 9 中不再可用(它是灰色的)。我遵循了几个建议将底部约束设置为容器边距,但这并没有帮助这种向下移动。

有没有人找到解决这个问题的方法?似乎只有在推送转换完成后才能识别隐藏 tabBarController 的几何形状。

【问题讨论】:

隐藏推送类viewDidLoad的tabbar 我尝试通过在 viewDidLoad 中的推送 viewController 上添加 self.tabBarController!.tabBar.hidden = true 来实现。同样的事情也会发生。 在带有 XCode 的 iOS 9 中,有一种方法可以设置底部布局。我将发布与之相关的解决方案。 【参考方案1】:

原来我的 inputAccessoryView 导致了奇怪的滚动行为。对我有用的解决方案是在覆盖中返回附件视图之前添加 view.layoutIfNeeded():

override var inputAccessoryView: UIView? 
     get 
        view.layoutIfNeeded()
        return accessoryView
     

因此,对于这种涉及嵌入在 tabBarController 中的 navigationController 的特殊情况,您希望将其推送到隐藏 tabBar 的 viewController:

    选中在情节提要上按下时隐藏底部栏

    将您呈现的视图底部固定到容器底部(使用上面建议的方法,或者只需选择屏幕底部的图钉图标,然后在底部约束上选择下拉箭头和固定图即可查看)

    最后,如果您使用的是 inputAccessoryView,请将 layoutIfNeeded() 添加到 getter 的覆盖中,就像我在上面所做的那样。

【讨论】:

【参考方案2】:

在 Xcode7 中,您必须右键单击您的元素,在底部画一条线,直到弹出约束选择器。约束选择器

然后按 ALT,现在您将获得所需的底部约束

【讨论】:

是的,我也遇到过这个问题并尝试过,但它也不起作用。我仍然可以看到视线向下移动。您也可以使用情节提要底部的 pin 工具并选择底部 pin 约束旁边的下拉箭头来实现您正在做的事情。视图转换完成后,我仍然可以看到视图跳下。以前通过选择底部布局指南。底部我没有任何问题。使用您的解决方案并使用容器底部对我不起作用。 实际上我只是放慢了动画的速度,现在使用您的解决方案的不同之处在于,在推送的 viewController 中呈现的 collectionView 在出现时正在滚动,而不是已经滚动到底部已经。卷轴现在可见,这是我不想要的。 所以要清楚,如果我将底部约束设置为底部布局指南,则视图看起来已经滚动并且完全正确,只是在过渡完成后它会向下移动。如果我只是按照您的建议将底部约束更改为容器底部,则视图滚动会在 viewController 的转换过程中以可见的方式发生。 我还应该提到我正在转换到的 viewController 包含和 inputAccessoryView。如果我删除它,滚动效果就消失了,一切正常。所以以某种方式使用带有输入附件视图的底部容器约束会导致问题。

以上是关于在 iOS 中的 navigationController 堆栈中隐藏 tabBar 时,视图在屏幕上显示后向下移动的主要内容,如果未能解决你的问题,请参考以下文章

导航栏设置了背景图片后恢复默认

在 Swift 中对 UITabBarController 进行 segue 后如何摆脱 UINavigationController?

隐藏导航栏会导致视图向上移动

swift跳转时隐藏tabbar,跳回时显示

自定义推送动画打破默认交互式弹出动画

为什么在首次启动时我的导航栏位于状态栏下