web-dev-qa-db-fra.com

Comment rendre dynamique la hauteur d'UITableView avec la fonction de mise en page automatique?

J'utilise la mise en page automatique dans Xcode 5.

J'ai défini la hauteur de la vue de table sur Supérieur ou égal à 200 px. Je veux qu'il ait une taille dynamique. Parce que parfois, il y aura plusieurs lignes, parfois il y aura quelques lignes.

Mais la taille est toujours de 200 pixels. Et si le contenu est plus grand que cela, je devrais faire défiler vers le bas pour voir les rangées inférieures.

Que dois-je faire pour donner à la table une taille dynamique?enter image description here

35
Burak

Ceci est testé avec la dernière version de Xcode.

1) Dans Xcode, allez dans le storyboard et cliquez sur votre vue de table pour le sélectionner.

2) Dans le volet Utilitaires (voir image 1), assurez-vous que la contrainte pour la hauteur de la vue de table est définie.

Table view heigth constraint

3) Dans le contrôleur de vue qui affiche la vue de table, créez une sortie pour cette contrainte:

Dans Swift 3

@IBOutlet weak var dynamicTVHeight: NSLayoutConstraint!

Dans l'objectif C

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *dynamicTVHeight;

4) Dans le storyboard, revenez à la contrainte de hauteur pour le UITableView et vérifiez que l'icône de droite a changé la couleur du violet au bleu (voir image 2)

Table view heigth constraint after outlet

4) Mettez également ce code dans le même contrôleur de vue:

Swift

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
}


override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let height = min(self.view.bounds.size.height, tableView.contentSize.height)
    dynamicTVHeight.constant = height
    self.view.layoutIfNeeded()
}

Objectif c

- (void)viewWillAppear:(BOOL)animated
{
    // just add this line to the end of this method or create it if it does not exist
    [self.tableView reloadData]; 
}

-(void)viewDidLayoutSubviews
{
    CGFloat height = MIN(self.view.bounds.size.height, self.tableView.contentSize.height);
    self.dynamicTVHeight.constant = height;
    [self.view layoutIfNeeded];
}

Cela devrait résoudre votre problème.

Ce sont les liens vers deux versions de l'exemple de projet qui fait ce que vous voulez, une pour Objective C et l'autre pour Swift 3. Téléchargez-la et testez-la avec Xcode. Les deux projets fonctionnent avec la dernière version de Xcode, Xcode 8.3.2.

https://github.com/jcatalan007/TestTableviewAutolayouthttps://github.com/jcatalan007/TestTableviewAutolayoutSwift

65
Juan Catalan

créez votre cellule par xib ou storyboard. donner son contenu de sortie. appelez-le maintenant dans CellForRowAtIndexPath. par exemple. si vous souhaitez définir la hauteur des cellules en fonction du texte de l'étiquette du commentaire.enter image description here

définissez-vous donc commentsLbl.numberOfLine = 0;

puis dans ViewDidLoad

 self.table.estimatedRowHeight = 44.0 ;
self.table.rowHeight = UITableViewAutomaticDimension;

et maintenant

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;}

voila ............ vous l'avez fait ....

4
Mohit tomar

Vous pouvez Ctrl + Glisser la contrainte de hauteur de votre UITableView dans le code source de votre contrôleur de vue et lui donner un nom. Ensuite, dans updateViewConstraints de votre ViewController, vous pouvez définir la constante de cette contrainte sur tableView.contentSize.height

....

@IBOutlet weak var tableViewHeightConstraint: NSLayoutConstraint?

....

override func updateViewConstraints() {
    super.updateViewConstraints()
    tableViewHeightConstraint?.constant = tableView.contentSize.height
}
2
Christian Aberger

Cela peut être fait par programme. Le concept (et le code lui-même) est en fait très simple:

Dans la méthode updateConstraints de la vue d'ensemble de myTableView, ajoutez une contrainte de sorte que la hauteur de myTableView soit égale à myTableView.contentSize.height.

Testé sur Xcode 6 ciblant iOS 7.

2
Donald