web-dev-qa-db-fra.com

L'appel de «[UIView -systemLayoutSizeFittingSize:]» sur un UITableViewCell échoue toujours

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:

  • Si j'ai défini manuellement cellHeight sur une grande valeur, les cellules semblent toutes bien sauf que la hauteur est incorrecte.
  • Interface Builder ne me donne aucun avertissement concernant les restrictions ambiguës
  • [cell hasAmbiguousLayout] renvoie NO.
  • Ma cellule a, entre autres, une image définie à 48x48, donc une taille de (0, 0) ne devrait pas satisfaire toutes les contraintes.

Des idées?

20
Aaron Brager

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:

Comment redimensionner la vue d'ensemble pour qu'elle s'adapte à toutes les sous-vues avec la mise en page automatique?

38
TomSwift

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

2
Rafał Augustyniak