如何为每个UICollectionViewCell设置不同的高度

时间:2015-06-22 03:04:20

标签: ios swift

我觉得这应该比它容易得多。我想要做的就是为每个集合视图的单元格设置不同的高度(取决于每个单元格内部标签的大小)。我正在使用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子类的实例才能启动(所以我实际上可以访问标签并尝试确定高度)。被困在这几个小时。 :/

2 个答案:

答案 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)
}