J'utilise la mise en page automatique avec UICollectionViewCell. L'idée est donc de permettre à CollectionViewCell de déterminer sa taille en fonction des dispositions. Toutes les contraintes sont définies correctement mais le problème est que je ne peux pas calculer sa taille pour la méthode de source de données
collectionView:layout:sizeForItemAtIndexPath:
Idéalement, j'aimerais calculer la hauteur de la cellule en procédant comme suit:
static MyCell *myCell = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
myCell = [[MyCell alloc] initWithFrame:CGRectZero];
});
cell.model = model;
[cell updateConstraints];
[cell layoutSubviews];
return cell.frame.size;
mais cela ne force pas les contraintes à se mettre à jour, donc le cadre de la cellule est zéro. Pouvez-vous me conseiller comment calculer la taille de la cellule en fonction de ses contraintes?
Merci
voici la solution
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
YourCollectionCell * cell = (YourCollectionCell *) [YourCollectionViewObj cellForItemAtIndexPath:indexPath];
if (cell == nil) {
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"YourCollectionCell" owner:self options:nil];
cell = [topLevelObjects objectAtIndex:0];
cell.frame = CGRectMake(0, 0, CGRectGetWidth(self.view.frame), 20);
// SET YOUR CONTENT
[cell layoutIfNeeded];
}
CGSize CellSize = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize withHorizontalFittingPriority:UILayoutPriorityDefaultHigh verticalFittingPriority:UILayoutPriorityDefaultLow];
return CellSize;
}
Je pense que vous devriez retourner cette taille:
return [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
Pour votre hauteur dynamique de UICollectionViewCell dans UIcollectionViewcontroller, vous devez implémenter la méthode ci-dessous: -
(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath