对于基于内容长度的动态单元格大小,您基本上必须做一些近似。所以这是我的解决方案。它涉及到几次反复试验才能使计算正确。现在请耐心等待!
override func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if let user = datasource?.item(indexPath) as? User {
let approximateWidthBioTextView = view.frame.width - 10 - 60 - 10
let size = CGSize(width: approximateWidthBioTextView, height: 1000)
let attributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 15)]
let estimatedFrame = NSString(string: user.bio).boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: attributes, context: nil)
return CGSize(width: view.frame.width, height: estimatedFrame.height + 73)
}
return CGSize(width: view.frame.width, height: 200)
}
基本上你需要改变 sizeForItem 函数并做一些近似。我的内容由User Class 的实例决定。因此,请确保在开始参考您的单元格内的内容之前。就我而言,这是一个需要显示的用户。简而言之,我的解决方案是基于 user.bioText 的单元格高度。因为这是我单元格中唯一改变大小的元素。所以请记住这一点。
首先,您必须计算collectionView。在我的例子中,它是框架的宽度减去边距(10、60 和 10)。请记住,重要的是要做到这一点。
其次,为了估计单元格的高度,我们需要将其包装在一个矩形中,该矩形具有一些需要填写的属性。在size 常量中,我们故意给出一个高值,以便系统获取它真正需要的值。现在对于属性,如果您的内容是我的情况下的字符串,请确保您具有相同的字体大小。
最后,在返回部分return CGSize(width: view.frame.width, height: estimatedFrame.height + 73),我们仍然需要进行一些更正,因为如果我可以这样说,文本有一些内部填充,除非你更正,否则你的单元格高度将无法正确显示。确保使用最后一个值estimatedFrame.height + 73,在我的情况下为 73,直到达到完美动态分配单元格高度的地步。这是唯一的方法。它确实对我有用。
顺便说一句,如果您的代码看起来有点不同(虽然不太不同),请不要打扰。我用的是框架,但是计算原理是一样的。如果您问自己,73 值是从哪里形成的,那是因为在我需要在每个单元格中显示的生物文本的顶部,我有用户名和用户名的标签,它们都有 20 中的 8,使 40总共 33 是它们之间的差距或边距。只要你给它最小值,它就可以工作。如果你给它一个太高的值,它并不会真正影响结果。所以实验吧!