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