web-dev-qa-db-fra.com

Taille du contenu UITableView lors de l'utilisation de la mise en page automatique

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.

18
OnkarK

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.

31
OnkarK

Enfin, j'ai compris votre problème et voici la solution.

J'espère que vous l'avez déjà fait.

  1. Prenez d’abord une hauteur fixe de UITableView.
  2. Ensuite, prenez la contrainte IBOutlet de UITableView Height.
  3. Ensuite, sous la méthode 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.

11
Sohil R. Memon

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
4
Tzegenos

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
            }
        }
    }
}
2
flo bee

Vous pouvez essayer deux choses,

  1. 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];
      });
    }
    
  2. 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.

2
Bharat Modi

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.

1
Stefan S

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)
}
0
Brian Hong

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.

0
nikans

pour Swift simplement utiliser

tableView.invalidateIntrinsicContentSize()
tableView.layoutIfNeeded()

après reloadData () et 

tableView.contentSize.height

va fonctionner parfaitement . Exemple sur le support

0
Daniil Chuiko