Le redimensionnement UITableView pour s'adapter contenu
Je suis entrain de créer une application qui aura une question dans un UILabel
et un choix multiple de réponses affichées dans UITableView
, chaque ligne indiquant un questionnaire à choix multiples. Les Questions et les réponses varieront, alors j'ai besoin de cette UITableView
être dynamique en hauteur.
Je voudrais trouver un sizeToFit
travail autour de la table. D'où le tableau de l'image est réglée à la hauteur de tout, c'est le contenu.
Quelqu'un peut-il m'indiquer comment y parvenir?
- Pour ceux qui cherchent à faire quelque chose de similaire sur OSX, voir à cette question: stackoverflow.com/questions/11322139/...
- salut, pouvez-vous expliquer quel est le problème avec le "sizeToFit" approche s'il vous plaît ?:)
- “Je voudrais trouver un "sizeToFit" contourner”. Donc, avez-vous ou n'avez-vous pas essayé UIView de
- sizeToFit
méthode?
Vous devez vous connecter pour publier un commentaire.
En fait j'ai trouvé la réponse moi-même.
Je viens de créer un nouveau
CGRect
pour latableView.frame
avec leheight
detable.contentSize.height
Qui définit la hauteur de la
UITableView
à laheight
de son contenu.Depuis que le code modifie l'INTERFACE utilisateur, ne pas oublier d'exécuter dans le thread principal:
Swift 5 et 4.2 solution sans KVO, DispatchQueue, ou la définition des contraintes de vous-même.
Cette solution est basée sur Gulz réponse.
1) Créer une sous-classe de
UITableView
:2) Ajouter un
UITableView
à votre mise en page et de définir des contraintes sur tous les côtés. Définissez la classe àContentSizedTableView
.3) Vous devriez voir quelques erreurs, car Storyboard ne pas prendre nos sous-classe'
intrinsicContentSize
en compte. Résoudre ce problème en ouvrant la taille de l'inspecteur et en remplaçant la intrinsicContentSize à une valeur de l'espace réservé. C'est un remplacement pour le temps de conception. À l'exécution, il va utiliser le remplacer dans notreContentSizedTableView
classeMise à jour: Changé de code Swift 4.2. Si vous utilisez une version antérieure, utilisez
UIViewNoIntrinsicMetric
au lieu deUIView.noIntrinsicMetric
tableView
êtreIntrinsicTableView
dans le storyboard. Je n'ai pas besoin d'incorporer ma table d'afficher dans une autreUIView
.tableView
àIntrinsicTableView
. Également un emballage supplémentaireUIView
n'est pas nécessaire. Vous pouvez utiliser n'importe quel parent de voir 🙂tableView.sizeToFit()
sizeToFit()
doit être appeléeself
s.Swift Solution
Suivez ces étapes:
1 - Régler la hauteur de la contrainte de la table à partir de la table de montage séquentiel.
2 - faites Glisser la hauteur de la contrainte à partir de la table de montage séquentiel et de créer @IBOutlet dans la vue contrôleur de fichier.
3 - Ensuite, vous pouvez modifier la hauteur de la table dynamicaly l'aide de ce code:
Mise à jour
Si la dernière ligne est coupé pour vous, essayez d'appeler viewWillLayoutSubviews() dans willDisplay la fonction des cellules:
J'ai essayé cela en iOS 7 et il a travaillé pour moi
Ajouter un observateur de la contentSize de propriété sur la vue de la table, et ajuster la taille de l'image en conséquence
puis dans le rappel:
Espère que cela va vous aider.
Dans le cas où vous ne voulez pas suivre le tableau de la vue de la taille du contenu des modifications vous-même, vous pourriez trouver cette sous-classe utile.
override public var intrinsicContentSize: CGSize { //... return someCGSize }
J'ai eu une vue de la table à l'intérieur de défilement et avait pour calculer tableView de la hauteur et de la redimensionner en conséquence. Ce sont les étapes que j'ai prises:
0) ajouter une UIView à votre scrollView (probablement de travailler sans cette étape, mais je l'ai fait pour éviter d'éventuels conflits) - ce sera une containr pour votre table. Si vous prenez cette étape , puis définissez les points de vue des frontières droit à la tableview plus.
1) créer une sous-classe de UITableView:
2) définir la classe d'une vue de la table dans la table de montage séquentiel pour IntrinsicTableView: capture d'écran: http://joxi.ru/a2XEENpsyBWq0A
3) Définir les heightConstraint à votre vue de la table
4) faites glisser le IBoutlet de votre table à votre ViewController
5) faites glisser le IBoutlet de votre table de hauteur de l'obstacle à votre ViewController
6) ajouter cette méthode dans votre ViewController:
Espère que cette aide
Swift 3, iOS 10.3
Solution 1:
Vient de mettre
self.tableview.sizeToFit()
danscellForRowAt indexPath
fonction. Assurez-vous de définir tableview hauteur de plus, alors vous avez besoin.C'est une bonne solution si vous n'avez pas vues ci-dessous tableview. Toutefois, si vous avez, bas tableview contrainte ne sera pas mis à jour (je n'ai pas essayer de le réparer parce que je suis venu avec la solution 2)
Exemple:
Solution 2:
Ensemble tableview hauteur de la contrainte dans le storyboard et faites-le glisser vers le ViewController. Si vous connaissez la moyenne de la hauteur de votre cellule et vous savez comment beaucoup d'éléments de votre tableau contient, vous pouvez faire quelque chose comme ceci:
*EDIT:
Après toutes les solutions que j'ai essayé et chacun d'eux a été réparé quelque chose, mais pas complètement, cette est la réponse qui explique et corrige ce problème complètement.
Dans le cas où votre contentSize n'est pas droit, c'est parce qu'il est basé sur le estimatedRowHeight (automatique), utilisez-le avant
source : https://forums.developer.apple.com/thread/81895
Mimo répondre et Anooj VM 's réponse les deux sont géniaux, mais il y a un petit problème si vous avez une grande liste, il est possible que la hauteur du cadre de coupure de certains de vos cellules.
Donc. J'ai modifié la réponse un peu:
Il y a une bien meilleure manière de le faire si vous utilisez la mise en page automatique: variation de la contrainte qui détermine la hauteur. Juste calculer la hauteur de votre table des matières, puis de trouver la contrainte et de les modifier. Voici un exemple (en supposant que la contrainte qui détermine votre table de hauteur est en fait une hauteur de contrainte en relation avec "l'Égalité"):
myTableHeightConstraint.constant = tableView.contentSize.height
objc version de Musa almatri
Vous pouvez essayer cette Coutume
AGTableView
Pour Définir une TableView Hauteur de la Contrainte à l'Aide de maquette ou de la programmation. (Cette classe extraire automatiquement une hauteur de contrainte et de définir l'affichage du contenu de la hauteur de yourtableview hauteur).
Note Si un problème pour définir une Hauteur puis
yourTableView.layoutSubviews()
.Basé sur la réponse de fl034. Mais pour Xamarin.iOS utilisateurs:
Comme une extension de Anooj VM réponse, je suggère ce qui suit à d'actualiser le contenu de la taille que lorsqu'il change.
Cette approche a également désactiver le défilement correctement et soutenir de grandes listes de et rotation. Il n'est pas nécessaire de dispatch_async parce que contentSize changements sont expédiés sur le thread principal.
Mu solution dans une swift 3: Appeler cette méthode dans
viewDidAppear