集合视图单元格中的多行标签在重用后中断

Posted

技术标签:

【中文标题】集合视图单元格中的多行标签在重用后中断【英文标题】:Multiline label in collection view cell breaks after reuse 【发布时间】:2017-04-07 11:53:34 【问题描述】:

我有一个自定义 UICollectionViewCell,其中包含多个 UI 元素,使用代码中的 AutoLayout 设置进行布局。

在更大的设备(iPhone 6 及更高版本)上一切正常。

然而,在较小的设备上,多行 UILabel 会中断,但仅(似乎)在重用后才会中断。

在初始显示时,第一个单元格如下所示:

在单元格被滚动出屏幕并再次打开后,它看起来像这样:

这些是标签上设置的约束:

    descriptionLabel.centerXAnchor.constraint(equalTo: firstButton.centerXAnchor),
    descriptionLabel.leadingAnchor.constraint(equalTo: otherLabel.leadingAnchor),
    descriptionLabel.topAnchor.constraint(equalTo: firstButton.bottomAnchor, constant: 15),
    secondButton.topAnchor.constraint(greaterThanOrEqualTo: descriptionLabel.bottomAnchor, constant: 20),

我觉得这与 greaterThanOrEqualTo 约束有关,但如果我用一个普通的旧 equalTo 约束替换它,布局就会变得疯狂,标签会缩小到只适合一行。

【问题讨论】:

【参考方案1】:

我在UICollectionView 中遇到过类似的问题,我在preferredMaxLayoutWidth 属性和widthAnchor 中找到了解决方案

productNameLabel.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 0.6)
productNameLabel.preferredMaxLayoutWidth = self.frame.size.width * 0.6

它应该可以解决问题。

【讨论】:

leadingcentreX 应该注意宽度,但我会看看 preferredMaxLayoutWidth 我不确定leadingcenterX 是否应该关心宽度。这意味着将标签固定在左侧或右侧并在 X 轴上居中。因此,如果我正确理解约束,它可能会产生一些冲突。我建议使用leading 并设置width 但是我的UICollectionViewCells在重用时遇到了同样的问题,这解决了问题:) preferredMaxLayoutWidth 似乎解决了我的问题 - 谢谢!我可以确认leadingcentreX 适用于水平位置和宽度。前导约束给视图它的 x 位置,并且视图知道它需要将它的中间与另一个视图的中间对齐,因此相应地调整它的宽度 (Y)

以上是关于集合视图单元格中的多行标签在重用后中断的主要内容,如果未能解决你的问题,请参考以下文章

如何通过单击更改集合视图单元格中的标签颜色

具有固定高度的表格单元格中的自动布局多行标签

重用 uitableview 单元格以及单元格中的子视图

UITableViewCell 中的 UICollectionView 重用

表格单元格中的多行文本会损坏视图

表格视图单元格中的集合视图