ios - 仅使用文本计算 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 像素的边距。
先感谢您。
解决方案
要计算 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
推荐阅读
- python - 如何查看已删除的推文?
- azure-iot-central - Azure IoT 设备离线命令问题
- python - 如何在matplotlib中使用循环更改值后结合坐标点
- windows - 使用短名称和 DisplayName 创建服务会破坏服务的 WMI
- javascript - 使用 Jquery 将多个 .change 函数合并为一个
- docker - 如何使用letsencrypt在ha代理dockerfile上安装SSL证书
- python - Composer Airflow - 没有名为“exchangelib”的模块
- php - XML 与命名空间解析 php
- python - 如何从 Python 代码运行 Flask 命令并捕获输出?
- android - Ionic 5 将 blob 加载到图像中必须为最后一个图像运行 ChangeDetectorRef