如何根据 UILabel 动态调整 CollectionViewCell 的大小

Posted

技术标签:

【中文标题】如何根据 UILabel 动态调整 CollectionViewCell 的大小【英文标题】:How to dynamically size CollectionViewCell as per UILabel 【发布时间】:2020-01-09 09:47:09 【问题描述】:

我正在创建一个建议/标签视图。这基本上是一个水平的uicollectionview。我有一个自定义单元格,其中只有一个标签,没有自动调整大小或自动约束。我有一个数组var tagsArray = ["Label", "A Long Label", "A very long label"],我在 collectionView 委托方法中使用它:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    return tagsArray.count


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
    let size = (tagsArray[indexPath.row] as NSString).size(withAttributes: nil)
    return size


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TagCell", for: indexPath) as! TagCollectionViewCell
    cell.tagLabel.text = tagsArray[indexPath.row]
    return cell


第二个函数 collectionViewLayout 是我选择的表单堆栈溢出,但是当我运行它时,对 UILabel 没有影响。

这是输出:

【问题讨论】:

你可以使用这个库来查看标签:github.com/ElaWorkshop/TagListView 添加您的输出图像。 @dahiya_boy 添加了输出图像。 @ChaudhryTalha 您需要使用this method 来获取字符串的确切宽度。之后添加一些边距,以便您的 UI 看起来不错。我在 Obj-c 中做了同样的事情,link,作为它的一行代码,所以你也可以将它转换为 swift。 @dahiya_boy 我已经通过目标 c 链接添加了 let tagSize = (tagsArray[indexPath.row] as NSString).boundingRect(with: (tagsArray[indexPath.row] as NSString).size(withAttributes: nil), options: .usesLineFragmentOrigin, attributes: nil, context: nil).size,然后在 sizeForItemAt 函数中添加了 return CGSize(width: tagSize.width, height: 40),但它仍然没有工作。 【参考方案1】:

您不需要计算要显示的字符串的大小。执行以下操作:

    collectionView 的高度设置为标签的预期高度。 设置tagLabelleadingtrailingtopbottom约束等于对应单元格的contentView约束。 删除func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 的实现。如果您不为estimatedItemSize 使用自定义值,将自动计算单元格大小。如果您想确定,请将(collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.estimatedItemSize = UICollectionViewFlowLayout.automaticSize 添加到您设置所有视图的函数中。

您将看到以下结果:

【讨论】:

@LalKrishna 在 ios 11 和 iOS 12 上尝试了此代码,它工作正常。 contentView在xib中不显示怎么办? @VyachaslavGerchicov 我认为你应该问一个新问题。你也可以使用ru.***.com。 不,我认为你的回答不完整 @VyachaslavGerchicov contentView 应该在 xib 文件中可见。还是你出于某种原因隐藏了它?

以上是关于如何根据 UILabel 动态调整 CollectionViewCell 的大小的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式根据行数动态调整 UILabel 的大小

根据 UILabel 动态调整 uitableViewCell 大小(带段落间距)

以编程方式动态调整多行 UILabel 和随附的表格视图单元格

无论文本如何,UILabel 都会将高度调整为 0

当视图宽度发生变化时,如何使 UILabel 正确调整其尺寸?

UILabel 动态内容自动调整大小问题