web-dev-qa-db-fra.com

iOS 8 La cellule de hauteur automatique n'a pas la bonne hauteur lors de la première charge

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?

22
Dennis

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.

31
rdelmar

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

20
Sihad Begovic

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
}
1
leonardloo

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.

1
lpa

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.

0
Angela C