Je souhaite utiliser la mise en page automatique pour UITableViewCells. Ces cellules de tableau ont une hauteur dynamique (en fonction de la longueur du texte).
J'utilise [UIView -systemLayoutSizeFittingSize:]
pour calculer la hauteur de cellule appropriée (pour retourner dans [UITableView -heightForRowAtIndexPath:]
) mais j'obtiens toujours les résultats suivants:
Si je passe UILayoutFittingCompressedSize
, je récupère une CGSize de (0,0).
Si je passe UILayoutFittingExpandedSize
, mon application se bloque avec cette erreur:
*** Échec de l'assertion dans - [NSISLinearExpression incrementConstant:], /SourceCache/Foundation_Sim/Foundation-1043.1/Layout.subproj/IncrementalSimplex/NSISLinearExpression.m:620
(Je suppose que cela signifie qu'un certain nombre est infini.)
Ma mise en œuvre est simple. Je calcule la hauteur de chaque objet, puis je la cache:
MessageCell *cell = // allocate a new cell...
// set up the cell (assign text, images, etc)
CGSize size = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
self.cellHeight = size.height; // size always equals (0, 0)
Je fais l'hypothèse que c'est un problème avec les contraintes que j'ai définies, mais:
cellHeight
sur une grande valeur, les cellules semblent toutes bien sauf que la hauteur est incorrecte.[cell hasAmbiguousLayout]
renvoie NO
.Des idées?
C'est ce qui fonctionne pour moi (notez 'contentView')
CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
EDIT: J'ai répondu à une question similaire et fourni un exemple complet, ici:
Il est difficile de dire quelque chose de concret sur la base de votre message, car vous n'avez pas publié de contraintes que vous utilisez. Apple Documentation:
systemLayoutSizeFittingSize:
Renvoie la taille de la vue qui satisfait les contraintes qu'elle contient.
Vous avez peut-être créé des contraintes qui peuvent être interprétées de la manière dont la taille de la cellule est égale à (0,0).
Il existe une autre façon de vérifier la hauteur de la cellule avec le texte. Vous pouvez mettre votre texte dans UITextView puis:
UITextView textView;
textView.text = @"l";
textView.font = [UIFont fontWithName:FONT_NAME size:FONT_SIZE];
//some code here
//
CGFloat cellHeight = textView.contentSize.height;
Il est important de définir le texte et la police (et toutes les autres propriétés pouvant entraîner la modification de la hauteur de UITextView) de UITextView avant d'utiliser la propriété contentSize. Vous devez également d'abord ajouter UITextView à la vue.
////// EDIT
Le problème avec votre approche de l'utilisation des contraintes peut être que vous souhaitez mesurer la cellule qui N'EST PAS ajoutée à la vue afin que le système ne dispose pas de toutes les informations dont il a besoin. Il ne sait pas combien d'espace il y aura pour l'espace, etc. car il ne connaît pas la zone environnante de la cellule