如何根据 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
的高度设置为标签的预期高度。
设置tagLabel
的leading
、trailing
、top
和bottom
约束等于对应单元格的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 动态调整 uitableViewCell 大小(带段落间距)
以编程方式动态调整多行 UILabel 和随附的表格视图单元格