NSLayoutContraints:如何将底视图定位在两个标签中较高标签的下方?
NSLayoutContraints: How to position a bottom view below the higher of two labels?
我正在开发一个 iOS 11+ 应用程序,我想创建一个如下图所示的视图:
这两个标签根据标签内容定位为不同高度的列。由于用户输入的自定义文本,两个标签的内容都是可变的。因此,我无法确定这两个标签中的哪个在运行时更高,而且高度也没有限制。
如何定位 BottomView
使其与两列/标签中较高的列/标签有 20 像素的边距?
两个标签都应该只使用最小值。显示所有文字所需的高度。因此,给两个标签一个相同的高度不是解决方案。
我尝试对两个标签使用 大于 20px 的垂直间距,但这(当然)会导致 Inequality Constraint Ambiguity
.
是否可以仅使用 Autolayout 解决这个简单的任务,还是我必须在代码中手动检查/设置尺寸和边距?
您可以将标签添加到 stackView
实现此目的的一种方法是为两个标签分配相同的高度约束。通过这样做,标签的高度将始终等于大标签(内容更多的标签)。
您可以通过选择两个标签并添加等高约束来完成此操作,如屏幕短片中所述。
结果会像下面这样
给出的答案确实有效,但不是很有教育意义。 "Use a stack view." 是的,但什么是堆栈视图?它是一种为您制定约束的视图。这不是魔术。堆栈视图做什么,你就可以做什么。围绕这两个标签并将自身调整为其中较长的一个普通视图就可以了。 stack view,作为一个stack view,在这里并没有做什么特别的事情。您可以自己使用约束来构建相同的东西。
(其实周围的view也不是很需要,不过这样可能会更封装一些,所以就这样吧。)
这是你的项目 运行 在我的机器上的一个版本:
另外一个标签变长了:
那是怎么做到的呢?这只是普通的约束。这是故事板:
两个标签从它们的底部到父视图的底部都有一个大于或等于的约束(恰好有一个常数 20)。他们所有的其他限制都是显而易见的,我不会在这里描述它们。
好的,但这还不够。仍然存在歧义,Xcode 会告诉你。不平等需要以某种方式解决。我们需要在不平等的另一端有所作为。解决方案是多一个约束:superview 本身的高度约束为 1,优先级为 749。这是一个足够低的优先级以允许标签的抗压缩性运行。
因此标签获得了它们的完整高度,并且父视图试图尽可能短地折叠到 1,但它被两个不等式阻止了:它的底部必须比两个标签的底部低 20 点以上。这样我们就得到了想要的结果:超级视图的底部在 longest 标签的底部下方 exactly 20 points.
我正在开发一个 iOS 11+ 应用程序,我想创建一个如下图所示的视图:
这两个标签根据标签内容定位为不同高度的列。由于用户输入的自定义文本,两个标签的内容都是可变的。因此,我无法确定这两个标签中的哪个在运行时更高,而且高度也没有限制。
如何定位 BottomView
使其与两列/标签中较高的列/标签有 20 像素的边距?
两个标签都应该只使用最小值。显示所有文字所需的高度。因此,给两个标签一个相同的高度不是解决方案。
我尝试对两个标签使用 大于 20px 的垂直间距,但这(当然)会导致 Inequality Constraint Ambiguity
.
是否可以仅使用 Autolayout 解决这个简单的任务,还是我必须在代码中手动检查/设置尺寸和边距?
实现此目的的一种方法是为两个标签分配相同的高度约束。通过这样做,标签的高度将始终等于大标签(内容更多的标签)。
您可以通过选择两个标签并添加等高约束来完成此操作,如屏幕短片中所述。
结果会像下面这样
(其实周围的view也不是很需要,不过这样可能会更封装一些,所以就这样吧。)
这是你的项目 运行 在我的机器上的一个版本:
另外一个标签变长了:
那是怎么做到的呢?这只是普通的约束。这是故事板:
两个标签从它们的底部到父视图的底部都有一个大于或等于的约束(恰好有一个常数 20)。他们所有的其他限制都是显而易见的,我不会在这里描述它们。
好的,但这还不够。仍然存在歧义,Xcode 会告诉你。不平等需要以某种方式解决。我们需要在不平等的另一端有所作为。解决方案是多一个约束:superview 本身的高度约束为 1,优先级为 749。这是一个足够低的优先级以允许标签的抗压缩性运行。
因此标签获得了它们的完整高度,并且父视图试图尽可能短地折叠到 1,但它被两个不等式阻止了:它的底部必须比两个标签的底部低 20 点以上。这样我们就得到了想要的结果:超级视图的底部在 longest 标签的底部下方 exactly 20 points.