解决方案包括3个简单步骤:
启用动态单元格大小
flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
设置来自collectionView(:cellForItemAt:)的containerview . widthachor .constraint来限制contentView的宽度为collectionView的宽度。
class ViewController: UIViewController, UICollectionViewDataSource {
...
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! MultiLineCell
cell.textView.text = dummyTextMessages[indexPath.row]
cell.maxWidth = collectionView.frame.width
return cell
}
...
}
class MultiLineCell: UICollectionViewCell{
....
var maxWidth: CGFloat? {
didSet {
guard let maxWidth = maxWidth else {
return
}
containerViewWidthAnchor.constant = maxWidth
containerViewWidthAnchor.isActive = true
}
}
....
}
因为你想要启用UITextView的自调整大小,它有一个额外的步骤来;
3.计算和设置高度tanchor。常量的UITextView。
当contentView的宽度被设置时,我们会在didSet的maxWidth中调整UITextView的高度。
UICollectionViewCell Inside job:
var maxWidth: CGFloat? {
didSet {
guard let maxWidth = maxWidth else {
return
}
containerViewWidthAnchor.constant = maxWidth
containerViewWidthAnchor.isActive = true
let sizeToFitIn = CGSize(width: maxWidth, height: CGFloat(MAXFLOAT))
let newSize = self.textView.sizeThatFits(sizeToFitIn)
self.textViewHeightContraint.constant = newSize.height
}
}
这些步骤会让你得到想要的结果。
完整的可运行的要旨
参考:Vadim Bulavin博客文章-集合视图单元格自我调整:一步一步的教程
截图: