Redimensionnez les cellules UICollectionView après avoir défini leurs données

Mes cellules UICollectionView contiennent des UILabels avec du texte multiligne. Je ne connais pas la hauteur des cellules tant que le texte n’a pas été placé sur l’étiquette.

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath; 

C’était la méthode initiale que j’ai utilisée pour dimensionner les cellules. Cependant, cela s’appelle AVANT que les cellules soient créées hors du storyboard.

Existe-t-il un moyen de mettre en forme la collection et de dimensionner les cellules après leur rendu, et je connais la taille réelle de la cellule?

Je pense que vous recherchez la méthode invalidateLayout vous pouvez appeler sur la propriété .collectionViewLayout de votre UICollectionView. Cette méthode régénère votre mise en page, ce qui dans votre cas signifie aussi appeler -collectionView: layout: sizeForItemAtIndexPath: c’est le bon endroit pour refléter la taille souhaitée de votre article. Jirune indique la bonne façon de les calculer.

Un exemple d’utilisation de invalidateLayout peut être trouvé ici . Consultez également la documentation UICollectionViewLayout sur cette méthode:

Invalide la disposition en cours et déclenche une mise à jour de la mise en page.

Discussion:

Vous pouvez appeler cette méthode à tout moment pour mettre à jour les informations de mise en page. Cette méthode invalide la présentation de la vue de collection elle-même et la renvoie immédiatement. Ainsi, vous pouvez appeler cette méthode plusieurs fois à partir du même bloc de code sans déclencher plusieurs mises à jour de mise en page. La mise à jour de la mise en page proprement dite a lieu lors du prochain cycle de mise à jour de la disposition de la vue.

Modifier:

Pour la vue de collection de storyboard qui contient des contraintes de présentation automatique, vous devez remplacer la méthode UIViewController de UIViewController et appeler la disposition de vue de collection invalidateLayout dans cette méthode.

 - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [yourCollectionView.collectionViewLayout invalidateLayout]; } 

Hé, dans la méthode delegate ci-dessus, vous pouvez calculer la taille UILabel utilisant la méthode ci-dessous et renvoyer la size UICollectionViewCell fonction de ce calcul.

  // Calculate the expected size based on the font and // linebreak mode of your label CGSize maximumLabelSize = CGSizeMake(9999,9999); CGSize expectedLabelSize = [[self.dataSource objectAtIndex:indexPath.item] sizeWithFont:[UIFont fontWithName:@"Arial" size:18.0f] constrainedToSize:maximumLabelSize lineBreakMode:NSLineBreakByWordWrapping]; 

sous-classe UICollectionViewCell et remplacer layoutSubviews comme ceci

par la présente, vous allez ancrer le bord avant et arrière de la cellule à la collectionVoir

 override func layoutSubviews() { super.layoutSubviews() self.frame = CGRectMake(0, self.frame.origin.y, self.superview!.frame.size.width, self.frame.size.height) } 
 - (void)viewDidLoad { self.collectionView.prefetchingEnabled = NO; } 

Dans iOS 10, prefetchingEnabled est YES par défaut. Lorsque YES , la vue de collection demande aux cellules de savoir à quel moment elles seront affichées. Cela conduit à un crash dans iOS 10