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?
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.
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)
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
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.
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 ....
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
}
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.