【问题标题】:Calculating height of UICollectionViewCell with text only仅使用文本计算 UICollectionViewCell 的高度
【发布时间】:2018-06-19 16:02:55
【问题描述】:

试图计算具有指定宽度的单元格的高度,但无法正确计算。这是一个sn-p。自定义布局指定了两列,它知道列宽。

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

sizecell.frame 都不正确。

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

提前谢谢你。

【问题讨论】:

    标签: ios swift uicollectionview uicollectionviewcell uicollectionviewlayout


    【解决方案1】:

    要计算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

    【讨论】:

    • 嗯,好的。我看到计算单元格内视图层次结构的宽度和高度比通过实例化它来计算整个单元格更简单。那我试试这个方法。仅供参考,我能够使用您的代码计算标签的高度。感谢您的帮助。
    • 是的,由于文本长度,大多数标签会弄乱单元格的大小,所以如果我们知道这一点,那么我们可以通过添加边距/填充轻松计算单元格的总大小。
    【解决方案2】:

    您从笔尖加载的单元格没有要放置的视图,因此它的框架不正确。

    您需要手动将其添加到视图中,然后对其进行测量,或者您需要将其从 collectionView 中出列,以便它已经在容器视图中

    【讨论】:

    • 当我将单元格出列并在其上调用layoutIfNeeded 时,结果是帧(0; 0; 187.5; 1.79769e+308) 仍然不正确。
    【解决方案3】:

    对于 Swift 4.2 更新的答案是根据 uilabel 文本处理 uicollectionview Cell 的高度和宽度

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
    {
      let size = (self.FILTERTitles[indexPath.row] as NSString).size(withAttributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14.0)])
        return CGSize(width: size.width + 38.0, height: size.height + 25.0)
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 2010-10-28
      相关资源
      最近更新 更多