带两个动态标签和自动布局的UICollectionViewCell动态高度

时间:2018-07-30 01:12:14

标签: ios swift uicollectionview autolayout uicollectionviewcell

我有一个UICollectionViewCell子类,该子类使用原型单元格和约束进行设置(每个视图都垂直和水平连接)。

我有两个标签,它们的大小可以不同,它们可以是一行或两行。为此,我在每个标签上设置了两个高度限制,一个大于或等于(取决于标签为16或20)而小于或等于(取决于标签为32或40)。

标签上的行数设置为0。(尽管我尝试了各种设置)。

由于我使用了自动布局和约束来设置视图,因此我在单元格的awakeFromNib()中的内容视图上指定了宽度

override func awakeFromNib() {
        NSLayoutConstraint.activate([contentView.widthAnchor.constraint(equalToConstant: 341)])
        super.awakeFromNib()
        configureBorder()
}

在collectionView的布局上,我为EstimateItemSize和itemSize指定了automaticDimension常量

if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
    flowLayout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
    flowLayout.itemSize = UICollectionViewFlowLayoutAutomaticSize
}

出于使用自动布局的想法,我在集合视图上实现了委托。

我遇到了非常不一致的布局,某些情况下该单元格的显示将按照我的意愿出现,在另一些情况下,标签被截断了,在另一些情况下,标签却非常狭窄,并在三行上显示了文本。

我尝试了很多事情,包括打电话 .sizeToFit() 在每个标签的text属性设置后,以及调用 .setNeedsDisplay() 在单元格从cellForItemAt返回之前

我想知道采用情节提要约束的正确方法是什么?我曾在SO上针对类似问题解答过一些流行的答案,尽管没有任何真正的成功。

1 个答案:

答案 0 :(得分:4)

flowLayout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
flowLayout.itemSize = UICollectionViewFlowLayoutAutomaticSize

我当然很熟悉Apple的一再声明,即流布局中的UICollectionViewCell可以根据内部约束自动调整大小。但是我从未见过苹果公司演示过此功能的有效代码,而且我从未成功地证实了这些说法是正确的。我不相信真的有一个自定义大小的单元。多年以来,试图使一个单元自动调整大小会导致崩溃。在iOS 10中,崩溃几乎停止了,但是现在流布局没有正确布置单元格(听起来就像您看到的那样)。

自然地,我年复一年都提交了错误报告。

同时,我要做的是给集合视图委托并实现collectionView(_:layout:sizeForItemAt:),我建议您也应该这样做。

相关问题