在 IOS 中使用自动布局在邻居之间居中视图

Posted

技术标签:

【中文标题】在 IOS 中使用自动布局在邻居之间居中视图【英文标题】:Centering View between neighbors using autolayout in IOS 【发布时间】:2013-07-16 22:51:19 【问题描述】:

我正在尝试使用界面构建器中的约束(自动布局)来布局屏幕设计,并希望避免编码约束,但我猜我会接受任何一种情况的答案。

我在顶层视图中包含两个子视图。我想修复第一个子视图到屏幕顶部的垂直距离(我能够做到这一点 - 垂直空间约束的常见用例)。我希望第二个子视图浮动(垂直)在第一个子视图底部和屏幕底部之间的距离的中心。这个想法是,该设计对 iPhone 3.5" 和 4" 尺寸有所响应。

我无法定义一个或一组约束来实现这一点。

我尝试在第二个子视图与其邻居顶部(第一个子视图)和父视图底部之间的垂直间距约束上设置不等式,并使用这些约束的优先级。

在其他一些关于 SO 的相关帖子中提出的一个想法是使用一个固定到屏幕底部的容器,以及固定到第一个子视图的底部边缘,然后将我的第二个子视图居中容器中的子视图。如果可能,我希望避免使视图层次结构复杂化,但这可能不容易避免。

有什么想法或建议吗?

【问题讨论】:

在界面生成器中,您可能不得不使用容器。如果您愿意在代码中摆弄约束,则可以添加比例约束,因此您可以将顶部和底部空间设置为相等,这将实现您所追求的。 我只试了 10 分钟,但无法完成。也许只有我一个人,但到目前为止,我只发现了两种使自动布局在 IB 中工作的技术:1)随机提升、固定和删除东西,直到它意外地达到我想要的效果。过了一会儿,转到技巧 2),即放弃并编写代码。 您在上一段中提到的建议是最简单的方法。 【参考方案1】:

更新

This answer 描述了如何在 Xcode 6.0 中执行此操作(并且可能适用于 Xcode 5.0 和 5.1)。

原创

如果您想使用自动布局执行此操作,则必须添加至少一个间隔视图。它不必是垂直居中视图(或任何其他视图)的父视图,因此它对视图层次结构的影响非常小。

我建议不要尝试在 Xcode 4.6.3 的 Interface Builder 中设置约束。这太痛苦了。但如果你真的必须这样做,这是可行的。

    从 top-hugging 视图的底部边缘到 superview 的底部边缘创建一个间隔(一个普通的 UIView)。将其设置为隐藏。将其约束到顶部拥抱视图以及根视图的左边缘和下边缘,并固定其宽度。我的间隔宽度是 10:

    添加中间视图(此处为按钮)。给它一个“容器中的水平中心”约束。然后选择中间视图和间隔视图,并给它们一个“垂直中心”约束:

请注意,如果您在 IB 显示正确的指南时放下中间视图,它将为您设置这些约束。

您可以通过启用调整后代(但不是兄弟姐妹和祖先)的大小并调整 IB 中的根视图的大小来进行测试。中间视图将保持在顶部拥抱视图和父视图底部之间的中心:

【讨论】:

虽然这确实涉及层次结构中的额外视图,但它比我认为我必须做的要优雅一些。非常感谢。 在不平凡的情况下需要额外的辅助视图。约束表示两个属性之间的线性关系,所以如果你想要三个属性之间的关系,你必须使用多个约束来达到预期的效果。

以上是关于在 IOS 中使用自动布局在邻居之间居中视图的主要内容,如果未能解决你的问题,请参考以下文章

具有自动布局的 iOS UIScrollView 未正确居中

以编程方式自动布局不垂直居中

IOS自动布局缩小

使用自动布局居中模态视图

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

自 IOS 8 以来使用自动布局和滚动视图的额外顶部空白