我觉得这应该比它容易得多。我想要做的就是为每个集合视图的单元格设置不同的高度(取决于每个单元格内部标签的大小)。我正在使用sizeForItemAtIndexPath
,但问题是在创建单元格之前确定高度。
我现在拥有的内容:
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
// target width of each cell - widht of the collectionView
let targetWidth: CGFloat = collectionView.frame.width - 20.0
// setup a prototype cell
var cell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCustomCellIdentifier", forIndexPath: indexPath) as! MyCustomCell
// for the sake of simplicity, let's just assume data is coming from somewhere else
cell.nameLabel.text = data.name
cell.notesLabel.text = data.notes
// resize - layoutSubviews in LocationCell controller
cell.layoutIfNeeded()
// get the size based on constraints
var size = cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
// force width
size.width = targetWidth
return size
}
什么不起作用dequeueReusableCellWithReuseIdentifier
。我猜是因为UICollectionViewCell
还没有?我也试过registerClass
来获得它,但这似乎也没有用。 :(
有一种更简单的方法可以完全做到这一点吗?我需要做的就是在创建单元格之前弄清楚单元格的高度。我需要一个UICollectionViewCell
子类的实例才能启动(所以我实际上可以访问标签并尝试确定高度)。被困在这几个小时。 :/
答案 0 :(得分:1)
这不是正确的方法,但对我有用
使用此函数获取文本的大小
func labelSize(texto: NSString) -> CGRect {
var atributos = [NSFontAttributeName: UIFont.systemFontOfSize(17)]
var labelSize = texto.boundingRectWithSize(CGSizeMake(280, CGFloat(MAXFLOAT)), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: atributos, context: nil)
return labelSize
}
答案 1 :(得分:1)
使用此方法
func heightForComment(comment:NSString,font: UIFont, width: CGFloat) -> CGFloat {
let rect = NSString(string: comment).boundingRectWithSize(CGSize(width: width, height: CGFloat(MAXFLOAT)), options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
return ceil(rect.height)
}