ViewController - (0,0) 处的主视图元素被导航栏遮挡

Posted

技术标签:

【中文标题】ViewController - (0,0) 处的主视图元素被导航栏遮挡【英文标题】:ViewController - main view elements at (0,0) are obscured by navigation bar 【发布时间】:2016-04-10 15:09:40 【问题描述】:

我有一个简单的案例,我将一个新的视图控制器推送到导航控制器堆栈上。这个 VC 使用 xib 并有一个UISearchBar,它被限制在顶部和左侧的“容器”中,在这种情况下,它只是主视图。

当我将此 VC 推入堆栈时,看不到搜索栏。这是因为导航栏位于顶部,占据了设备屏幕的前 50 个左右的点。 (大概在状态栏之后开始)。

如果我将顶部容器自动布局约束设置为 50,或者一些足以抵消导航栏高度的 y 偏移量,我将看到搜索栏。

我正在做一个项目,我将 VC 推送到我没有创建的 UINavigationController 的导航堆栈上。我想知道什么原因会导致这种(我称之为错误)行为。我的理解是,在存在导航/状态/标签栏的情况下,导航控制器中的任何视图控制器都会对其主视图的框架进行调整。我该怎么做才能确保原点(0,0)从屏幕原点+状态栏高度+导航栏高度开始?此外,我还希望我的 VC 的 mainView 的下限在标签栏的顶部结束,也出现在屏幕上。我研究了各种 UIView 和 ViewController 属性,但没有找到令人满意的解决方案。

【问题讨论】:

【参考方案1】:

如果您使用 xib 文件来设计您的视图控制器,您应该将此代码添加到您的 viewDidLoad 方法中:

self.edgesForExtendedLayout = UIRectEdgeNone

这一行将使您的视图控制器的视图布局在导航栏下方。

【讨论】:

【参考方案2】:

按照惯例,任何新的UIViewControllers 都是在情节提要上完成的,一些开发人员会在第一个和第二个UIViewController 之间进行衔接。这样做的原因是因为通过实现推送 segue,第二个UIViewController 在第一个之上,第二个将继承第一个具有的任何属性(例如导航栏、工具栏、标签栏),并立即显示在故事板上.

因此,知道要为UINavigationUITabbar 分配多少空间,处理第二个UIViewController 会更容易。

如果您的 VC 是在 XIB 接口上完成的,而不是挂接到先前 ViewController 的 UINavigationController 受控堆栈上,那么我猜您看不到 UINavigationBarUITabBar 应该占用的空间在你的界面上?

也许您可以尝试将约束设置为从顶部布局指南下方 64 点开始(为UINavigationBar 腾出空间)和底部布局指南上方 49 点(以腾出空间UITabbar)。

【讨论】:

以上是关于ViewController - (0,0) 处的主视图元素被导航栏遮挡的主要内容,如果未能解决你的问题,请参考以下文章

位置 0 处的 ArrayList IndexOutOfBoundsException

索引 0 处的 InsertItem - DoubleLinkedList

存储到堆栈地址的双字是不是会影响地址+0..3 或地址-0..3 处的字节?

从源“http://localhost:3000”访问“http://127.0.0.1:5000/product”处的 XMLHttpRequest

索引 0 处的 QTreeWidgetItem.insertChild

JSONException:字符 0 处的输入结束