如何使用自动布局在两个子视图控制器之间移动?

Posted

技术标签:

【中文标题】如何使用自动布局在两个子视图控制器之间移动?【英文标题】:How can I move across two child view controllers with autolayout? 【发布时间】:2013-08-16 20:13:00 【问题描述】:

我正在制作一个带有左侧边栏容器视图和一个作为导航控制器的主容器视图的视图控制器。

这是它的图片:

我正在使用自动布局,所以我只能使用约束。

如何使屏幕仅显示此视图控制器的一部分? 我无法更改框架,因为我正在使用自动布局...

【问题讨论】:

你想让它显示哪一部分? 正确的容器视图。然而它最终向我展示了这个......imgur.com/qpVPShX 所以你想让左边容器的宽度变成0,有效吗?或者,也许 X 原点向左移动,使得右侧容器是唯一可见的东西? 让 x 原点向左移动,这样右边的容器是唯一可见的。我正在使用自动布局,这就是我迷路的地方。 【参考方案1】:

首先,尝试调整包含视图(持有这两个容器的视图)的框架以将其向左移动。

理论上只是[rightContainerView superview]

如果这对您不起作用,您始终可以遍历在任一视图上设置的约束并删除/调整它们,直到获得所需的布局。您可以保留在视图控制器上的数组中删除的约束,然后在需要恢复时将它们添加回来。

[view constraints]

【讨论】:

但是不碰边框不是自动布局的规则吗? 不一定。自动布局的目的是让您在希望自动布局视图的布局时不必触摸视图的框架。当您需要显式移动视图时,您仍然必须显式移动视图。如果您想更改约束,您当然可以随时进行。但听起来你只是想将一个视图移过来,然后再移回来,保持其他部分之间的关​​系完好无损。 如果您有时间,WWDC 2012 和 2013 中有关自动布局的视频非常有助于阐明自动布局的许多最常见用例。【参考方案2】:

您只需调整约束的常量参数。所以你会希望你的两个容器视图对超级视图的顶部和底部有约束。右容器应固定在父视图的右侧,并且从其左侧到左容器视图的右侧具有 0 长度约束(但没有固定宽度)。给左容器视图一个对父视图左边缘的约束和一个宽度约束。这应该给你足够的约束来定义你的起点。将 IBOutlet 设置为左​​侧容器视图对超级视图左边缘的约束(我们称之为 leftCon)。然后,当您想将左容器视图移出屏幕左侧时,更改其 leftCon 约束的常量值:

self.leftCon.constant = -200; // this will move it 200 point to the left, and the right view will expand by 200 points.

【讨论】:

这使我的 titleView 看起来像这张图片一样... i.imgur.com/DxDbux0.png 我唯一拥有的是一个 titleView ,它在右上角有一个图像(aspectFit)和一个搜索navigationItem导航栏的。 @AnthonyGlyadchenko,我不确定我在你的图片中寻找什么。当左视图移开时,您希望发生什么?您是否希望右视图展开,或者当两个视图都在屏幕上时隐藏它的某些内容,当右视图移到屏幕上时隐藏的内容会显示出来?

以上是关于如何使用自动布局在两个子视图控制器之间移动?的主要内容,如果未能解决你的问题,请参考以下文章

使用 iOS 自动布局在子视图控制器与其父视图之间建立约束

使用自动布局进行编辑时在表格视图中调整子视图的大小

在所有子视图自动布局之前调用 viewWillTransitionToSize

垂直自动布局子视图

如何使用自动布局来移动视图

如何管理自动布局中两个视图之间的间隙