为什么 UITableViewCell 相互重叠?

Why UITableViewCell's overlap each other?

我有一个简单的 UITableViewCell,其中包含 UIImageView 和 3 个 UILabel。在这里,我提供一个正常的单元格外观来深入理解问题:

如您所见,描述标签可能​​很长,所以我将 numberOfLines 设置为 0。但是当描述为空或太小时就会出现问题。细胞开始相互重叠。以下是描述为空或较小时的样子:

如果您注意到,图片相互重叠。我对视图的约束如下:

我也提供了Content Hugging and Compression Resistance Priorities。我只为 UILabel 提供了它们。我为描述标签设置了最小的,以便它增长和收缩。

我做了什么来解决这个问题?

我意识到如果描述为空,单元格会变小。换句话说,标签决定单元格的大小。此外,考虑到 UIImageView 仅垂直居中,我认为我的约束不正确。因此,我决定摆脱 垂直居中 UIImageView。我只为 UIImageView 设置了顶部、前导、宽度和高度约束。其他约束同上。但这没有帮助,结果如下:

如您所见,UIImageView 超出了单元格边界。我认为它发生是因为我没有为 UIImageView 提供底部约束。但我提供它用于描述。因此,下一个尝试实际上是提供底部约束。因此,我为 UIImageView 提供了顶部、左侧、底部和宽度约束。我让其他约束保持不变。最初,结果令我惊讶。以下是没有描述时单元格的外观:

看起来一切都很好(无论如何,图像太小,它试图适应单元格大小,这是由标签控制的),但是在滚动 UITableView 之后,单元格正在改变它们的大小并且不知何故更新他们的约束。这是发生的事情:

我也试过设置estimatedRowHeight和自动尺寸,但没有用,我不认为这样可以解决问题。所以,任何帮助表示赞赏。

保持 Image view 上的约束为 superview,width,height,vertically centered。保持对书名和作者标签的约束。现在在细节标签上将约束作为作者标签的顶部,尾随到超级视图,引导或左侧到图像视图,底部到超级视图。对于 bottom to superview constraint on detail label 在 Attributes inspector 中将关系更改为大于或等于。将常量更改为您 need.I 建议增加常量并进行测试的值,直到获得所需的结果。从大约 20 或 30 开始并测试,然后将值增加到其他值,直到获得您想要的效果。在这个常数的某个值,你会得到效果。 希望这可以帮助。

注意:这是假设您的书名标签和作者标签至少有一些文字。它可能会在其他设备上失败,所以也使用大小 类 来设置不同的约束