为啥带有 UILabel 的嵌套 UIStackViews 需要 Y 位置和高度约束?

Posted

技术标签:

【中文标题】为啥带有 UILabel 的嵌套 UIStackViews 需要 Y 位置和高度约束?【英文标题】:Why do nested UIStackViews with UILabels require Y position and height constraints?为什么带有 UILabel 的嵌套 UIStackViews 需要 Y 位置和高度约束? 【发布时间】:2020-01-27 15:43:32 【问题描述】:

我正在尝试解决我们在UITableViewCell 中遇到的问题。有嵌套的 UIStackViews 子视图,如 UILabel 具有固有的内容大小。我创建了这个例子来简化我的问题的解释:

导致这些界面生成器错误:

Top Stack 
View Need constraints for: Y position, height
Middle Stack 
View Need constraints for: Y position, height
Bottom Stack 
View Need constraints for: Y position, height
据我(和我的同事)理解,堆栈和表格视图单元格的大小应由 UILabels 及其内在内容大小决定。 “外部堆栈视图”对其父视图(“表格视图单元格”)有四个空间限制,其中 0 作为常量,因为最终表格视图单元格和所有堆栈视图大小应基于内容视图。 所有UIStackView 都有Fill 用于对齐和分布属性。 我只是将它从库中拖到一起,如图所示,没有在检查器中摆弄。很容易复制。 向与父堆栈视图相关的标签添加 0 空间顶部和底部约束并不能解决据称缺少高度约束的堆栈视图。 界面构建器的建议约束是无稽之谈。

缺少什么?我在 GitHub 上创建了一个 example project。

【问题讨论】:

您是否尝试过大于或等于cero?从outerStackView到单元格contentView的底部? 【参考方案1】:

您必须将OutterStackView 底部约束设置为greater than or equal 到单元格内容视图的底部。

看到问题是您要求 OutterStackView 与 StoryBoard 中的单元格大小相同,但由于您的内部标签还没有最终的内在内容大小,因此您无法满足所有约束要求。

【讨论】:

根据the official documentation,UILabel 默认情况下确实有一个内在的内容大小。 对不起,如果我错过了使用这个词,而不是母语人士,我的意思是那个小时的外部堆栈视图想要一个它无法在情节提要中实现的大小,只有当你调用 cellForRow 时,单元格大小计算正确,而不是在情节提要中 连接外部堆栈视图底部与单元格内容视图底部的约束没有解决问题。向标签添加>= 22 约束可以解决上面的堆栈视图缺少约束的问题。 是的,看我的截图,我使用了相同的布局。 我也遇到了类似的问题。对我来说,将 >= 约束添加到外部 UIStackView 的底部到 superview 解决了这个问题。

以上是关于为啥带有 UILabel 的嵌套 UIStackViews 需要 Y 位置和高度约束?的主要内容,如果未能解决你的问题,请参考以下文章

为啥允许使用泛型 lambda 而不允许使用带有模板化方法的嵌套结构?

UILabel 在嵌套的 UIStackViews 中被截断?

Flutter嵌套列表视图为啥我不能使用行?

为啥我的 UILabel 的 AutoLayout 不起作用

为啥 UIStackView 不堆叠 UILabel 安排的子视图?

为啥我的 UILabel 变量总是为零?