【问题标题】:UICollectionViewCell dynamic height w/two dynamic labels & auto layoutUICollectionViewCell 动态高度,带两个动态标签和自动布局
【发布时间】:2023-04-02 06:57:01
【问题描述】:

我有一个 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() 在每个标签上设置它的文本属性后,以及调用 .setNeedsDisplay() 在单元格从cellForItemAt返回之前

我想知道使用情节提要约束的正确方法是什么。我在 SO 上处理过类似问题的一些流行答案,但没有取得任何真正的成功。

【问题讨论】:

    标签: ios swift uicollectionview autolayout uicollectionviewcell


    【解决方案1】:
    flowLayout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
    flowLayout.itemSize = UICollectionViewFlowLayoutAutomaticSize
    

    当然,我熟悉 Apple 的反复声明,即 UICollectionViewFlowLayout 中的 UICollectionViewCell 可以根据内部约束自行调整大小。但我从未见过 Apple 的工作代码演示了此功能,而且我自己从来没有一次成功地证实了这些说法是正确的。我不相信真的有像自定尺寸单元这样的东西。多年来,试图让单元格自行调整大小导致了崩溃。在 iOS 10 中,崩溃基本上停止了,但现在流布局没有正确布置单元格(这听起来像您所看到的那样)。

    当然,我每年都在这方面提交错误。

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


    编辑 iOS 13 中的新功能,您可以使用可组合布局 并完全放弃 UICollectionViewFlowLayout。可自行调整大小的单元格在可组合布局中运行良好。

    【讨论】:

    • 感谢您的中肯建议和健全性检查。
    • 只是为了扩展一点,我所做的 in collectionView(_:layout:sizeForItemAt:) 是我期望运行时所做的:我将systemLayoutSizeFitting(_:) 应用于单元格的contentView获得由其子视图的约束在内部指定的大小。
    • 现在,说了这么多,如果您仍然无法正确调整单元格的大小,那么您的约束可能有问题。但至少我们可以将自动调整大小从图片中剔除,并在另一个问题中专注于这些。
    • 我真的尽了最大努力避免使用sizeForItemAt,但不幸的是,真的没有其他可靠的选择。在某些情况下,自动大小可能会起作用,但即使使用简单的performBatchUpdates,例如,也会有很多故障。对于 systemLayoutSizeFittings,我存储了可以配置的单元格的静态副本,这要归功于视图模型。找不到更智能的方法来使用无崩溃的运行时单元。您是否采用更清洁的方式? Tnx
    • @AlessandroFrancucci 不是。 :) Apple 在 WWDC 2019 上再次声称,这一次自调整大小的集合视图单元格今年真的很有效(在 iOS 13 中)。但我还没有测试。
    猜你喜欢
    • 2014-09-20
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多