Ios 为什么使用UITableViewCell';它彼此重叠吗?

Ios 为什么使用UITableViewCell';它彼此重叠吗?,ios,uitableview,autolayout,Ios,Uitableview,Autolayout,我有一个简单的UITableViewCell,其中包含UIImageView和3个UILabel。在这里,我提供了单元格的正常外观,以深入了解问题: 正如您所注意到的,描述标签可能很长,因此我将numberOfLines设置为0。但当描述为空或小时,问题就会出现。细胞开始相互重叠。以下是描述为空或小时的外观: 如果你注意到的话,图片相互重叠。我对视图的限制如下: UIImageView:指向superview,宽度和高度,垂直居中 BookName(顶部的粗体标签):顶部和尾部到super

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

正如您所注意到的,描述标签可能很长,因此我将
numberOfLines
设置为0。但当描述为空或小时,问题就会出现。细胞开始相互重叠。以下是描述为空或小时的外观:

如果你注意到的话,图片相互重叠。我对视图的限制如下:

  • UIImageView
    :指向superview,宽度和高度,垂直居中

  • BookName(顶部的粗体标签):顶部和尾部到superview,导致
    UIImageView

  • AuthorName(橙色标签):顶部到BookName,尾部到superview,导致
    UIImageView

  • 描述(灰色标签):尾随和底部到superview,顶部到AuthorName,并导致
    UIImageView
    (书籍图像)

我还提供了
内容拥抱和抗压缩优先级
。我只为
UILabel
提供了它们。我为描述标签设置了最小值,以使其增长和收缩

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

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

如您所见,
UIImageView
超出单元格边界。我认为这是因为我没有为
UIImageView
提供底部约束。但我提供它是为了描述。因此,下一次尝试实际上是提供底部约束。因此,我为
UIImageView
提供了顶部、左侧、底部和宽度约束。我保留了其他相同的约束条件。起初,结果令我惊讶。以下是没有描述时单元格的外观:

看起来,一切都很好(无论如何,图像太小,它试图适应单元格大小,这是由标签控制的),但在滚动
UITableView
后,单元格正在更改其大小并以某种方式更新其约束。发生的情况如下:


我还尝试设置
estimatedRowHeight
和自动尺寸标注,但没有帮助,我认为问题无法通过这种方式解决。因此,我们非常感谢您的帮助

将图像视图上的约束保持为超视图、宽度、高度和垂直居中。保持对书名和作者标签的约束不变。现在在细节标签上,将约束设置为从上到作者标签,从后到superview,从前到左到图像视图,从下到superview。对于细节标签上的“从底部到超级视图”约束,将“属性检查器”中的“关系”更改为“大于或等于”。将常数更改为所需的值。我建议增加常数并进行测试,直到得到所需的结果。从20或30左右开始测试,然后将值增加到其他值,直到获得想要的效果。在这个常数的某个值上,你会得到效果。 希望这有帮助

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


为您的描述标签设置高度约束,并将其>=设置为不会生成图像剪辑的值。谢谢!我会接受你的回答,但你是如何想出解决办法的呢?你是如何猜到改变关系和常数会起作用的?你说“也可以使用大小类来设置不同的约束”是什么意思?@abay细节标签是通过你原来的关系约束设置“相等”附加到单元格底部的。在这种情况下,假设是20。因此,在任何时候,详图标签底部和超级视图底部之间的距离都将保持在20。这可能会导致图像超出单元格的范围。当您说大于或等于并提供某个常量值时,假设为30,则详图标签底部和超级视图之间的距离永远不会小于30。它不会低于30,反过来单元格也不会变短,从而使图像保持在它的范围内。@abay简而言之,你说我的单元格不应该变短于某个特定值,当你说,“细节标签底部和superview底部之间的约束关系大于或等于。@可以想象约束关系等于且常量值为20。”。在这种情况下,距离必须始终为20。现在图像需要固定高度。单元格的高度必须最小,才能将图像保持在其边界内。当详图标签没有文本时,其高度为“0”。它将电池底部向上拉,以根据常数保持20的距离。拉起时,单元格的高度可能会小于使图像保持在边界内所需的最小高度。结果,图像超出了边界。