J'essaie de créer une mise en page structurée comme suit:

 - View 
   -- ScrollView
       --- ContentView
            ---- CustomView
            ---- CustomView
            ---- TableView
            ---- CustomView

Le tableView lui-même est redimensionnable automatiquement en utilisant "invalidateIntrinsicContentSize" et lorsque j'ajoute des éléments - la hauteur du tableview change, poussant la vue personnalisée en dessous plus bas.

Une fois que suffisamment d'éléments sont ajoutés, la vue personnalisée inférieure est masquée et le défilement ne fonctionne pas.

Fait important - la vue personnalisée inférieure n'a pas de contrainte inférieure. Il est poussé vers le bas par sa contrainte supérieure vers tableView.

Si je pose une contrainte de fond, la vue de la table ne sera plus redimensionnée dynamiquement.

Le comportement prévu: Lorsqu'un utilisateur ajoute des éléments à la liste et que la liste devient trop grande, ContentView pourra faire défiler afin que l'utilisateur puisse faire défiler pour voir le bas view.

Le comportement réel: lorsqu'un utilisateur ajoute des éléments à la liste et que la liste devient trop grande, la vue de dessous est poussée vers le bas et hors de vue et le contenu ne peut pas faire défiler.

Que se passe-t-il et comment puis-je y remédier?

0
Yosi199 19 juin 2019 à 16:28

4 réponses

Meilleure réponse

Voici ce que je pense de ce qui se passe.

Puisque vous utilisez UITableView, il a sa propre vue de défilement. Ainsi, lorsque la liste UITableView devient trop grande, UITableView lui-même devient scrollable plutôt que le contentView de ScrollView devenant scrollable.

Pour réaliser ce dont vous avez besoin, vous devez rendre le UITableView non scrollable et utiliser le intrinsicHeight du UITableView pour obtenir la hauteur réelle de UITableView avec tous les éléments . Si vous avez des éléments de différentes hauteurs, ce sera un problème car vous ne connaîtrez pas la hauteur avant le rendu. Avec la même hauteur pour toutes les lignes, vous pouvez obtenir la hauteur totale du UITableView et définir la contrainte de hauteur sur cette valeur. Cela augmentera le contentSize du ScrollView extérieur, le rendant ainsi défilable.

En dehors de UITableView, vous pouvez également utiliser UIStackView. C'est parce que vous n'utilisez de toute façon pas les capacités de réutilisation de UITableView. La gestion de datasource et delegates ne devrait pas être un gros problème.

1
Marwen Doukh - Maruän Duch 19 juin 2019 à 15:28

Vous pouvez créer une contrainte pour la hauteur de la vue table et prendre sa référence à votre fichier Swift, en le faisant glisser lorsque vous prenez d'autres vues. Maintenant dans ton code, fais juste ceci

tableViewHeightConstraint.constant = tableViewNoOfItems * tableViewCellHeight;

Si vous avez parfaitement défini d'autres contraintes dans scrollview, cela devrait fonctionner parfaitement. Signifie que TableView doit avoir des contraintes de marge top, bottom, left, right de ScrollView.

1
Asad Ali Choudhry 19 juin 2019 à 13:33

Essayez ce code

        tblViewHeight.constant = CGFloat( tableview row count * 45 ) 
        var size = contentView.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
        if size.height < scrollView.frame.size.height
         {
            size = scrollView.frame.size
        }
        contenViewHeight.constant = size.height - scrollView.frame.size.height
        scrollView.contentSize.height = contenViewHeight.constant
0
Jins George 19 juin 2019 à 13:40

Ce que je pense que vous pourriez faire, c'est:

  1. Désactiver le défilement de tableView tableView.isScrollEnabled = false
  2. Chaque fois qu'un utilisateur ajoute des éléments à la liste, rechargez le tableau

Utiliser également UIStackView avec un axe vertical et une distribution .fillEqually en tant que vue de contenu serait beaucoup plus pratique car vous n'aurez pas besoin de définir de contraintes de position pour vos vues, mais vous devrez peut-être définir des contraintes de hauteur si la taille du contenu intrinsèque le peut. t être déterminé par le moteur

0
vdmzz 19 juin 2019 à 16:19