在代码中使两个 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 = 0
或hidden = YES
,它将隐藏它们,但它们将充当布局脚手架。
通过这样做,titleLabel 上方的间隙将与 subTitleLabel 下方的间隙相同。
【讨论】:
哇,这真的是最简单的方法吗?对于您认为非常简单的事情来说,这是很多事情。 是的,不幸的是 AutoLayout 中的spaces
。即视图之间的差距。不是对象本身,因此不能等同于数字以外的任何事物。当然,您可以通过编程计算间隙并在计算出约束后更新约束,但这违背了使用自动布局的目的。最简单/唯一的方法是将不可见的视图用作“脚手架”。虽然这是一种常见的技术。许多人使用它。
是的,最初的技术就是我在 AutoLayout 陷入困境之前所做的事情。我会试试脚手架,看看它看起来有多突兀。非常感谢,先生:)【参考方案2】:
将您的标题和详细信息标签放入子视图中。然后为该子视图创建相对于封闭单元格的约束。由于您希望顶部和底部填充相等,您可以简单地选择垂直居中作为约束。
另外,假设 ios 8,我相信您可以允许表格单元格本身调整大小以适应子视图。
【讨论】:
以上是关于在代码中使两个 AutoLayout 约束相等?的主要内容,如果未能解决你的问题,请参考以下文章