Je souhaite calculer la taille du contenu de ma UITableView
. J'utilise autolayout avec une hauteur UITableViewAutomaticDimension
.
J'ai essayé d'obtenir [UITableView contentsize]
après avoir rechargé la table, dans ce cas, la hauteur est calculée en fonction de estimatedRowHeight
.
self.tableView.estimatedRowHeight = 50;
self.tableView.rowHeight = UITableViewAutomaticDimension;
Délégué -
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;
}
Essayer d'obtenir la taille du contenu et de l'attribuer à une contrainte de hauteur.
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
self.tableHeightConstraint.constant = self.tableView.contentSize.height;
Aucune suggestion? Merci d'avance.
Modifier:
Enfin, je suis résolu mon problème avec certains Tweak. J'ai réglé la hauteur de la table sur max (dans mon cas, 300 est la valeur maximale) avant de recharger les données sur la table, donc tableview dispose d'un espace pour redimensionner toutes les cellules.
self.tableHeightConstraint.constant = 300;
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
self.tableHeightConstraint.constant = self.tableView.contentSize.height;
Merci pour l'aide.
Enfin, je suis résolu mon problème avec certains Tweak. J'ai réglé la hauteur de la table sur max (dans mon cas, 300 est la valeur maximale) avant de recharger les données sur la table, donc tableview dispose d'un espace pour redimensionner toutes les cellules.
self.tableHeightConstraint.constant = 300;
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
self.tableHeightConstraint.constant = self.tableView.contentSize.height;
Afficher ceci afin que cela soit utile pour les autres.
Enfin, j'ai compris votre problème et voici la solution.
J'espère que vous l'avez déjà fait.
UITableView
.IBOutlet
de UITableView
Height.viewDidLayoutSubviews
, vous pouvez obtenir la hauteur UITableView
d'origine après avoir renseigné les données.Mettez à jour le code ci-dessous:
override func viewDidLayoutSubviews() {
constTableViewHeight.constant = tableView.contentSize.height
}
Mettre à jour:
self.tableView.estimatedRowHeight = UITableViewAutomaticDimension;
S'il te plaît, vérifie cela.
En définissant la propriété estimationRowHeight sur zéro lors de l'initialisation de la vue de table et en ajoutant le code suivant à viewDidLayoutSubviews, j'ai travaillé!
tableView.reloadData()
tableView.layoutIfNeeded()
tableView.constant = tableView.contentSize.height
Toutes les solutions ci-dessus ne fonctionnaient pas pour mon cas ... J'ai fini par utiliser un observateur comme celui-ci:
self.tableView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let obj = object as? UITableView {
if obj == self.tableView && keyPath == "contentSize" {
if let newSize = change?[NSKeyValueChangeKey.newKey] as? CGSize {
self.tableView.frame.size.height = newSize.height
}
}
}
}
Vous pouvez essayer deux choses,
Appelez la méthode juste après quelques secondes de délai après le rechargement complet de tableView.
- (void)adjustHeightOfTableview
{
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
//In my case i had to call this method after some delay, because (i think) it will allow tableView to reload completely and then calculate the height required for itself. (This might be a workaround, but it worked for me)
[self performSelector:@selector(adjustHeightOfTableview) withObject:nil afterDelay:0.3];
});
}
Lorsque vous appelez la méthode ci-dessus, ne retournez pas estimationHeightForRow,
/*
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 44;
}
*/
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}
Essayez, cela pourrait vous aider à résoudre le problème.
Pour moi, la solution consistait simplement à définir la estimatedRowHeight
sur une valeur plus grande que tout ce que j'estimais possible pour les données que je devais afficher.
Pour une raison quelconque, cela garantissait que la propriété estimatedRowHeight
n'était pas utilisée pour déterminer la contentSize
. Je n’affiche pas l’indicateur de défilement, donc cela n’était pas important pour moi que la variable estimatedRowHeight
soit très différente.
Dans mon cas, je n'utilise pas la contrainte de hauteur de tableView - en utilisant la mise en page automatique, la contrainte en haut et en bas est définie et seule la contrainte en bas change lorsque le mode d'édition est activé/désactivé.
La réponse de Tzegenos est modifiée de la manière suivante: 1. ajoutez tableView.estimatedRowHeight = 0
dans viewDidLoad () 2. ajoutez ce qui suit:
override func viewDidLayoutSubviews() {
// 60 is row's height as set by tableView( cellRowAt )
// places is of type [String] to be used by tableView
tableView.contentSize.height = 60 * CGFloat(places.count)
}
Vous pouvez également sous-classer la UITableView
et appeler qui vous voulez (c'est-à-dire la vue conteneur) à partir de sa layoutSubviews()
où vous avez certainement une contentSize
correcte.
pour Swift simplement utiliser
tableView.invalidateIntrinsicContentSize()
tableView.layoutIfNeeded()
après reloadData () et
tableView.contentSize.height
va fonctionner parfaitement . Exemple sur le support