2015-06-22 18 views
0

Я чувствую, что это должно быть намного проще, чем есть. Все, что я хочу сделать, это разная высота для каждой ячейки моего вида коллекции (в зависимости от размера метки внутри каждой ячейки). Я использую sizeForItemAtIndexPath, но проблема заключается в определении высоты до создания ячейки.Как установить разную высоту для каждого UICollectionViewCell

Что я сейчас:

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, чтобы даже иметь возможность начать (так что я могу на самом деле получить доступ к этикетке и попытаться определить высоту) застрял на этом в течение нескольких часов:../

ответ

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) 
} 
+0

Спасибо. Это работает. По-прежнему кажется, что я должен иметь возможность рассчитать высоту, основанную на фактической ячейке, или она должна быть более интуитивной, но я думаю, что это не так. :(Благодаря! – SeeMeCode

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 
    } 
+0

Звучит так, может случиться, так что спасибо. Я просто обеспокоен тем, что это может стать очень грязным в сложной компоновке. Там должен быть способ, так как коллекционные представления используются повсюду с ячейками разного размера. – SeeMeCode

Смежные вопросы