J'ai une application iOS 8 sur laquelle j'ai une page de résultats de recherche dans laquelle chaque cellule est automatiquement dimensionnée en fonction de la hauteur d'une certaine étiquette. Toutefois, après le chargement initial de la vue, les cellules affichées ne sont pas automatiquement redimensionnées. Après le défilement, les cellules suivantes sont correctement dimensionnées. Je suis en train de câbler les contraintes de mise en page automatique dans mon story-board. J'ai le code suivant dans viewDidLoad.
- (void)viewDidLoad {
[super viewDidLoad];
//configure tableView so that we use autolayout enabled row heights
self.tableView.estimatedRowHeight = 68;
self.tableView.rowHeight = UITableViewAutomaticDimension;
}
Quelqu'un d'autre a-t-il vécu cela?
Oui, j'ai constaté le même problème lors de la création des vues et des contraintes dans le storyboard (mais pas avec les vues ajoutées par le code). Iv'e a résolu ce problème en ajoutant ce code dans la classe de cellules personnalisée,
-(void)didMoveToSuperview {
[self layoutIfNeeded];
}
Cela pourrait probablement aller ailleurs, mais cette méthode ne semble s'appeler qu'une seule fois, alors j'ai pensé que c'était un bon endroit pour le faire.
La réponse de rdelmar n'a pas fonctionné pour moi.
Ce que j'ai fait est ajouté ce code:
[tableView setNeedsLayout];
[tableView layoutIfNeeded];
[tableView reloadData];
une fois les données récupérées et le premier [tableView reloadData]
appelé, qui dans mon cas est situé dans la méthode viewDidLoad
de mon contrôleur View.
Donc, le code de résultat serait:
NSArray *fetchedData = ...
[tableView reloadData]; //Fist table reload
[tableView setNeedsLayout];
[tableView layoutIfNeeded];
[tableView reloadData]; //Second table reload
Cette réponse est tirée d'ici: http://useyourloaf.com/blog/self-sizing-table-view-cells.html#comment-1783719287
Je pense qu'au lieu de forcer une tableView.reloadData()
et une tableView.layoutIfNeeded()
dans viewDidLoad
, vous pouvez simplement définir la hauteur automatique de votre tableView dans viewWillLayoutSubviews()
:
Rapide:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
tableView.estimatedRowHeight = 300
tableView.rowHeight = UITableViewAutomaticDimension
}
J'ai eu le même problème et je l'ai corrigé en déplaçant les affectations vers les propriétés de texte de la cellule UILabels (étant les seuls composants pouvant influer sur le calcul de la hauteur dans ma cellule) pour:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
au lieu de:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
Avant de faire cela, j'avais remarqué que la hauteur de la cellule serait correctement calculée si une cellule était déplacée momentanément hors écran, puis à nouveau visible. Probablement parce que, à ce stade, la cellule disposait des informations nécessaires concernant le contenu UILabel déterminant la hauteur finale.
J'ai pu contourner celui-ci en n'utilisant pas de plumes/de story-boards, mais plutôt de faire la mise en page par programme.