Je crée une application qui aura une question dans un UILabel
et une réponse à choix multiple affichée dans UITableView
, chaque ligne montrant un choix multiple. Les questions et les réponses varieront, donc j'ai besoin que cela UITableView
soit dynamique en hauteur.
Je voudrais trouver un sizeToFit
travail autour de la table. Où le cadre de la table est défini à la hauteur de tout son contenu.
Quelqu'un peut-il me conseiller sur la façon dont je peux y parvenir?
- sizeToFit
méthode d'UIView ?Réponses:
En fait, j'ai trouvé la réponse moi-même.
Je viens de créer un nouveau
CGRect
pour letableView.frame
avec leheight
detable.contentSize.height
Cela définit la hauteur de la
UITableView
à laheight
de son contenu. Puisque le code modifie l'interface utilisateur, n'oubliez pas de l'exécuter dans le thread principal:la source
Solution Swift 5 et 4.2 sans KVO, DispatchQueue ou définition de contraintes vous-même.
Cette solution est basée sur la réponse de Gulz .
1) Créez une sous-classe de
UITableView
:2) Ajoutez un
UITableView
à votre mise en page et définissez des contraintes sur tous les côtés. Définissez sa classe surContentSizedTableView
.3) Vous devriez voir des erreurs, car Storyboard ne prend pas en compte notre sous-classe
intrinsicContentSize
. Résolvez ce problème en ouvrant l'inspecteur de taille et en remplaçant intrinsicContentSize par une valeur d'espace réservé. Il s'agit d'un remplacement pour la conception. Au moment de l'exécution, il utilisera le remplacement dans notreContentSizedTableView
classeMise à jour: code modifié pour Swift 4.2. Si vous utilisez une version antérieure, utilisez à la
UIViewNoIntrinsicMetric
place deUIView.noIntrinsicMetric
la source
tableView
pour êtreIntrinsicTableView
dans le storyboard. Je n'avais pas besoin d'intégrer ma vue de table dans une autreUIView
.tableView
àIntrinsicTableView
. De plus, un emballage supplémentaireUIView
n'est pas nécessaire. Vous pouvez utiliser n'importe quelle vue parent existante bien sûr :)tableView.sizeToFit()
sizeToFit()
doivent être appelésSolution rapide
Suivez ces étapes:
1- Définissez la contrainte de hauteur pour la table à partir du storyboard.
2- Faites glisser la contrainte de hauteur depuis le storyboard et créez-y @IBOutlet dans le fichier du contrôleur de vue.
3- Ensuite, vous pouvez modifier dynamiquement la hauteur de la table en utilisant ce code:
Mettre à jour
Si la dernière ligne est coupée pour vous, essayez d'appeler viewWillLayoutSubviews () dans la fonction de cellule willDisplay:
la source
J'ai essayé cela dans iOS 7 et cela a fonctionné pour moi
la source
Ajoutez un observateur pour la propriété contentSize sur la vue de table et ajustez la taille du cadre en conséquence
puis dans le rappel:
J'espère que ceci vous aidera.
la source
J'avais une vue de table à l'intérieur de la vue de défilement et j'ai dû calculer la hauteur de tableView et la redimensionner en conséquence. Voici les mesures que j'ai prises:
0) ajoutez un UIView à votre scrollView (fonctionnera probablement sans cette étape mais je l'ai fait pour éviter tout conflit éventuel) - ce sera une vue conteneur pour votre vue table. Si vous suivez cette étape, définissez les bordures de la vue directement sur celles de la vue table.
1) Créez une sous-classe de UITableView:
2) définir la classe d'une vue de table dans Storyboard sur IntrinsicTableView: capture d'écran: http://joxi.ru/a2XEENpsyBWq0A
3) Définissez heightConstraint sur votre vue de table
4) faites glisser l'IBoutlet de votre table vers votre ViewController
5) faites glisser l'IBoutlet de la contrainte de hauteur de votre table vers votre ViewController
6) ajoutez cette méthode dans votre ViewController:
J'espère que cela t'aides
la source
Si vous ne souhaitez pas suivre vous-même les changements de taille de contenu de la vue tableau, vous pouvez trouver cette sous-classe utile.
la source
override public var intrinsicContentSize: CGSize { //... return someCGSize }
Si votre contentSize n'est pas correct, c'est parce qu'il est basé sur la valeur EstiméeRowHeight (automatique), utilisez ceci avant
source: https://forums.developer.apple.com/thread/81895
la source
Swift 3, iOS 10.3
Solution 1: Mettez simplement
self.tableview.sizeToFit()
encellForRowAt indexPath
fonction. Assurez-vous de régler la hauteur de la vue de la table plus élevée que nécessaire. C'est une bonne solution si vous n'avez pas de vues sous tableview. Cependant, si vous avez, la contrainte de vue du bas de la table ne sera pas mise à jour (je n'ai pas essayé de la corriger car j'ai trouvé la solution 2)Exemple:
Solution 2: définissez la contrainte de hauteur de tableview dans le storyboard et faites-la glisser vers le ViewController. Si vous connaissez la hauteur moyenne de votre cellule et que vous savez combien d'éléments votre tableau contient, vous pouvez faire quelque chose comme ceci:
*ÉDITER:
Une fois que toutes les solutions que j'ai essayé et chacun d'eux réparait quelque chose, mais pas complètement, c'est la réponse qui explique et corrige complètement ce problème.
la source
La réponse de Mimo et la réponse de Anooj VM à la fois sont impressionnantes , mais il y a un petit problème si vous avez une grande liste, il est possible que la hauteur du cadre sera coupure de vos cellules.
Alors. J'ai un peu modifié la réponse:
la source
Il existe une bien meilleure façon de le faire si vous utilisez la mise en page automatique: modifiez la contrainte qui détermine la hauteur. Calculez simplement la hauteur du contenu de votre table, puis trouvez la contrainte et modifiez-la. Voici un exemple (en supposant que la contrainte qui détermine la hauteur de votre table est en fait une contrainte de hauteur avec la relation «Égal»):
la source
myTableHeightConstraint.constant = tableView.contentSize.height
Cela fonctionne pour moi en utilisant la disposition automatique, avec une vue de tableau avec une seule section.
J'appelle cette fonction lors de la configuration de la disposition automatique (l'exemple ici utilise SnapKit, mais vous voyez l'idée):
Je veux que l'UITableView soit aussi haut que la hauteur combinée des cellules; Je boucle à travers les cellules et accumule la hauteur totale des cellules. Étant donné que la taille de la vue de tableau est CGRect.zero à ce stade, je dois définir les limites pour pouvoir respecter les règles de disposition automatique définies par la cellule. J'ai défini la taille sur une valeur arbitraire qui devrait être suffisamment grande. La taille réelle sera calculée ultérieurement par le système de mise en page automatique.
la source
Je l'ai fait d'une manière un peu différente, en fait, mon TableView était à l'intérieur de scrollview, j'ai donc dû donner une contrainte de hauteur à 0.
Ensuite, au moment de l'exécution, j'ai apporté les modifications suivantes,
la source
En tant qu'extension de la réponse d'Anooj VM, je suggère ce qui suit pour actualiser la taille du contenu uniquement lorsqu'elle change.
Cette approche permet également de désactiver correctement le défilement et de prendre en charge des listes et une rotation plus grandes . Il n'est pas nécessaire de dispatch_async car les modifications contentSize sont réparties sur le thread principal.
la source
version objc de Musa almatri
la source
Vous pouvez essayer cette coutume
AGTableView
Pour définir une contrainte de hauteur TableView à l'aide du storyboard ou par programme. (Cette classe récupère automatiquement une contrainte de hauteur et définit la hauteur de la vue du contenu sur la hauteur de votre table).
Remarque En cas de problème pour définir une hauteur, alors
yourTableView.layoutSubviews()
.la source
Basé sur la réponse de fl034 . Mais pour les utilisateurs de Xamarin.iOS :
la source
Ma mise en œuvre Swift 5 consiste à définir la contrainte de hauteur de la tableView à la taille de son contenu (
contentSize.height
). Cette méthode suppose que vous utilisez la disposition automatique. Ce code doit être placé à l'intérieur de lacellForRowAt
méthode tableView.la source
Si vous souhaitez que votre tableau soit dynamique, vous devrez utiliser une solution basée sur le contenu de la table comme détaillé ci-dessus. Si vous souhaitez simplement afficher une table plus petite, vous pouvez utiliser une vue de conteneur et y incorporer un UITableViewController - l'UITableView sera redimensionné en fonction de la taille du conteneur.
Cela évite beaucoup de calculs et d'appels à la mise en page.
la source
above
car les réponses pourraient être mélangées.Solution Mu pour cela dans swift 3 : appelez cette méthode dans
viewDidAppear
la source