首页 > 解决方案 > 仅使用文本计算 UICollectionViewCell 的高度

问题描述

试图计算具有指定宽度的单元格的高度并且无法使其正确。这是一个片段。自定义布局指定了两列,它知道列宽。

let cell = TextNoteCell2.loadFromNib()
var frame = cell.frame
frame.size.width = columnWidth // 187.5
frame.size.height = 0 // it does not work either without this line.
cell.frame = frame
cell.update(text: note.text)

cell.contentView.layoutIfNeeded()
let size = cell.contentView.systemLayoutSizeFitting(CGSize(width: columnWidth, height: 0)) // 251.5 x 52.5
print(cell) // 187.5 x 0
return size.height

size和都是cell.frame不正确的。

单元格内部有一个文本标签,每个标签边缘有 16 像素的边距。

先感谢您。

标签: iosswiftuicollectionviewuicollectionviewcelluicollectionviewlayout

解决方案


要计算 a 的大小UILabel以完全显示给定的文本,我将添加一个助手,如下所示,

extension UILabel {

   public static func estimatedSize(_ text: String, targetSize: CGSize = .zero) -> CGSize {
       let label = UILabel(frame: .zero)
       label.numberOfLines = 0
       label.text = text
       return label.sizeThatFits(targetSize)
   }
}

现在您知道文本需要多少大小,您可以通过添加您在单元格中指定的边距来计算单元格大小,即每边 16.0,因此,计算应如下所示,

let intrinsicMargin: CGFloat = 16.0 + 16.0
let targetWidth: CGFloat = 187.0 - intrinsicMargin
let labelSize = UILabel.estimatedSize(note.text, targetSize: CGSize(width: targetWidth, height: 0))
let cellSize = CGSize(width: labelSize.width + intrinsicMargin, height: labelSize.height + intrinsicMargin)

希望您能得到所需的结果。另一项改进是根据屏幕大小和列数计算宽度,而不是硬编码 187.0


推荐阅读