在代码中使两个自动布局约束相等



我是第一次通过自动布局(并且不使用IB/情节提要来这样做),我正在尝试在标题标签和细节标签的UITableViewCell中做一些简单的垂直对齐,布局如下:

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

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

我实际上正在使用砌体来实现这一点,它看起来像这样:

// 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行始终保持相同的值,以便标题/间距/细节位于中间。

我在这里错过了什么?

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

您不能使空间彼此相等。

您需要做的是使用不可见的"间隔"视图并使它们的高度相等。

所以你会有类似的东西...

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

使顶部间隔条和底部间隔条alpha = 0hidden = YES,它将隐藏它们,但它们将充当布局脚手架。

通过这样做,标题标签上方的间隙将与子标题标签下方的间隙相同。

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

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

最新更新