在代码中使两个 AutoLayout 约束相等?

Posted

技术标签:

【中文标题】在代码中使两个 AutoLayout 约束相等?【英文标题】:Make two AutoLayout constraints equal in code? 【发布时间】:2014-01-16 10:00:20 【问题描述】:

我第一次尝试通过 AutoLayout(而不是使用 IB/情节提要),我正在尝试在 UITableViewCell 中进行一些简单的垂直对齐,标题标签和详细标签,布局如下:

—————— 
Padding
Title Label
Spacing (3px)
Detail Label
Padding
——————

我正在努力的部分是让那里的两个“填充”约束始终保持相等。其他一切正常,但标签要么位于单元格的最顶部,要么位于最底部。

我实际上是使用 Masonry 来实现的,它看起来像这样:

// Constrain the title label at the top of the label container.
[title makeConstraints:^(MASConstraintMaker *make) 
    make.top.greaterThanOrEqualTo(self.contentView.top).with.priorityLow();
];

// Constrain the detail label to the bottom of the label container.
[detail makeConstraints:^(MASConstraintMaker *make) 
    make.top.equalTo(self.titleLabel.bottom).with.offset(3).with.priorityHigh();
    make.bottom.lessThanOrEqualTo(self.contentView.bottom).with.priorityLow();
];

我需要来自title 约束的make.top 行和来自detail 约束的make.bottom 行始终保持相同的值,以便标题/间距/细节位于中间。

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

这是你不能仅仅通过正常的约束来做的事情。

你不能让空格彼此相等。

您需要做的是使用不可见的“间隔”视图并使其高度相等。

所以你会有类似...

// in pseudo VFL
V:|[topSpacer][titleLabel]-[subTitleLabel][bottomSpacer(==topSpacer)]|

将topSpacer 和bottomSpacer 设为alpha = 0hidden = YES,它将隐藏它们,但它们将充当布局脚手架。

通过这样做,titleLabel 上方的间隙将与 subTitleLabel 下方的间隙相同。

【讨论】:

哇,这真的是最简单的方法吗?对于您认为非常简单的事情来说,这是很多事情。 是的,不幸的是 AutoLayout 中的 spaces。即视图之间的差距。不是对象本身,因此不能等同于数字以外的任何事物。当然,您可以通过编程计算间隙并在计算出约束后更新约束,但这违背了使用自动布局的目的。最简单/唯一的方法是将不可见的视图用作“脚手架”。虽然这是一种常见的技术。许多人使用它。 是的,最初的技术就是我在 AutoLayout 陷入困境之前所做的事情。我会试试脚手架,看看它看起来有多突兀。非常感谢,先生:)【参考方案2】:

将您的标题和详细信息标签放入子视图中。然后为该子视图创建相对于封闭单元格的约束。由于您希望顶部和底部填充相等,您可以简单地选择垂直居中作为约束。

另外,假设 ios 8,我相信您可以允许表格单元格本身调整大小以适应子视图。

【讨论】:

以上是关于在代码中使两个 AutoLayout 约束相等?的主要内容,如果未能解决你的问题,请参考以下文章

[New learn]AutoLayout调查基于code

iOS 在xib或者storyboard中添加AutoLayout后,在代码中修改AutoLayout约束条件

autolayout--约束的优先级

在AutoLayout - iOS中,约束计数总是变为零

Xcode Autolayout - 约束等于另一个约束

如何使用 Autolayout iOS 在两个视图之上设置视图