¿Cómo hacer que la altura de celda UICollectionview sea dinámica?

Tengo una UIcollectionview . Hay algunas celdas de Collectionview. Dentro de esa CollectionviewCell hay una vista de text. El contenido de la vista de text es dynamic. Entonces, la altura de la celda debe ser dinámica.

¿Como hacer eso?

1-Añadir protocolo UICollectionViewDelegateFlowLayout
2-Conforme al protocolo implementando el método sizeForItemAtIndexPath en su ViewController
3-Mediante el índice de la celda, obtenga el text que tiene y calcule la altura y el ancho de la misma.

 class ViewController: UIViewController,UICollectionViewDelegateFlowLayout{ func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { let constraintRect = CGSize(width: self.view.frame.size.width, height: CGFloat.max) let data = myTextArray[indexpath.row]; let boundingBox = data.boundingRectWithSize(constraintRect, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: UIFont(name: Constants.strings.fontName, size: 30)!], context: nil) return CGSizeMake(boundingBox.width, boundingBox.height); //(width,hight) } } 

Use NSAttributedString en sizeForItemAtIndexPath para calcular rect para el alto y el ancho:

 func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { let attString = NSAttributedString(string: self.rows[indexPath.row], attributes: [NSFontAttributeName: UIFont.systemFontOfSize(15.0)]) var r: CGRect = attString.boundingRectWithSize(CGSizeMake(self.collectionView.bounds.size.width, CGFLOAT_MAX), options: .UsesLineFragmentOrigin, context: nil) return r.size } 

1) Anular el método de delegado de collectionflowlayout

 func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { return CGSizeMake(50, 50); //(width,hight) } 

2) En el método anterior, calcule la altura de la vista de text que contiene la longitud dinámica y agregue ese valor en su altura fija. Ex. cellHeight = 100 + textview height. //100 is height which not contain textview height.

3) Después de calcular la altura, reemplácela por el método anterior

 func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { return CGSizeMake(50, dynamicheight); //(width,hight) } 

en objective-c

  - (CGSize)collectionView:(UICollectionView *)collectionView layout:(nonnull UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(nonnull NSIndexPath *)indexPath { if ()//your condition { return 280; } else { return 330; } } 

en swift

 func collectionView(collectionView : UICollectionView,layout collectionViewLayout:UICollectionViewLayout,sizeForItemAtIndexPath indexPath:NSIndexPath) -> CGSize { //check your conditions here ex: device, iOS version then return return CGSizeMake(64, 64) }