使用自动布局应用与同级视图相同的垂直位置

Posted

技术标签:

【中文标题】使用自动布局应用与同级视图相同的垂直位置【英文标题】:Apply same vertical position as sibling view with autolayout 【发布时间】:2014-08-01 13:23:25 【问题描述】:

我正在创建一个自定义 UITableViewCell,但我认为这没有什么不同 - 我的问题是独立的。

我正在继承一种现有的单元格样式,并添加一个视图。超类有一个视图(UILabel),它根据另一个标签中是否有内容来调整其在单元格中的垂直位置。如果第二个标签中有内容,则第一个标签在第二个标签和单元格视图顶部之间垂直居中。 如果第二个标签没有任何内容,则第一个标签在单元格视图的顶部和底部之间垂直居中。

我喜欢这种行为。我正在尝试在第一个标签旁边添加第三个标签。我使用自动布局约束将新标签固定在第一个标签附近,如下所示:

[NSLayoutConstraint constraintsWithVisualFormat:@"[firstLabel]-(5)-[thirdLabel]" options:0 metrics:nil views:views];

这工作正常,但我不知道如何在垂直位置上做类似的事情。理想情况下,我会将第三个标签“固定”为始终与第一个标签保持相同的垂直对齐方式,无论那是什么,但我不知道如何用视觉格式语言表达它。

作为替代方案,找出如何复制第一个标签的行为(根据是否存在第二个标签调整它的垂直对齐方式)。

当第二个标签存在时,此约束可以正确垂直对齐新标签,但如果该特定单元格上的第二个标签为空,则它不会做任何事情:

[NSLayoutConstraint constraintsWithVisualFormat:@"V:[thirdLabel][secondLabel]" options:0 metrics:nil views:views];

如何表达这种布局约束?

【问题讨论】:

【参考方案1】:

视觉格式语言最适合用于创建一个接一个对齐项目的约束。

对于更复杂的布局,例如您尝试构建的垂直居中对齐,您应该使用NSLayoutConstraintconstraintWithItem:[...]. 方法。

你可以这样做:

[NSLayoutConstraint constraintWithItem:thirdLabel
                               attribute:NSLayoutAttributeCenterY
                               relatedBy:NSLayoutRelationEqual
                                  toItem:firstLabel
                               attribute:NSLayoutAttributeCenterY
                              multiplier:1
                                constant:0];

希望这会有所帮助,

【讨论】:

效果很好 - 谢谢!我必须停止仅仅因为我不明白为什么存在某些东西,就认为它不是解决方案。

以上是关于使用自动布局应用与同级视图相同的垂直位置的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局更改按钮位置

使用自动布局检索子视图的正确位置

使用自动布局调整同级视图的大小时,使用子视图重新定位 UIView 不起作用

垂直自动布局两个视图,动态高度对齐顶部

在水平堆栈视图(自动布局)中将文本与图像垂直居中 - iOS

使用自动布局垂直居中子视图