web-dev-qa-db-fra.com

Calcul de contentSize pour UIScrollView lors de l'utilisation de la mise en page automatique

Voici une question rapide sur quelque chose qui fonctionne, mais qui pourrait être beaucoup mieux écrit. J'ai un UIScrollView et une liste d'objets disposés à l'intérieur, l'un sous l'autre. Tout se fait pendant viewDidLoad() et le placement des objets utilise Auto Layout. Voici ce que je fais pour définir la hauteur de contentSize du UIScrollView à sa valeur appropriée.

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    globalView.contentSize = CGSize(width: globalView.frame.width,
                                    height: globalView.frame.height * 1.59)
}

Cela fonctionne, mais la valeur arbitraire 1,59 a évidemment été décidée par moi en essayant quelques valeurs possibles. Quelle est la bonne façon de calculer le contentSize dans un tel cas? Je fais tout par programmation. La recherche sur le net ne m'a pas conduit à une réponse simple et claire, donc même si cela peut être une question quelque peu en double, j'ai décidé de la reformuler.

16
Michel

Donner la taille du contenu par programme n'est pas un bon moyen. La solution ci-dessous qui fonctionnera avec la mise en page automatique, n'a pas besoin de définir la taille du contenu. Il calculera le nombre de champs d'interface utilisateur ajoutés à la vue.

Étape 1:

Ajoutez Scrollview pour afficher dans le storyboard et ajoutez des contraintes de début, de fin, de haut et de bas (toutes les valeurs sont nulles).

Étape 2:

N'ajoutez pas directement les vues dont vous avez besoin sur scrollview directement, ajoutez d'abord une vue à scrollview (qui sera notre vue de contenu pour tous les éléments de l'interface utilisateur). Ajoutez les contraintes ci-dessous à cette vue.

1) Contraintes de début, de fin, de haut et de bas (toutes les valeurs sont nulles).

2) Ajoutez une hauteur et une largeur égales à la vue principale (c'est-à-dire qui contient scrollview). Pour une hauteur égale, réglez la priorité sur faible. (C'est l'étape importante pour définir la taille du contenu).

3) La hauteur de cette vue de contenu dépendra du nombre de vues ajoutées à la vue. disons que si vous avez ajouté la dernière vue est une étiquette et que sa position Y est de 420 et sa hauteur de 20, votre vue de contenu sera de 440.

Étape 3 : Ajoutez des contraintes à toutes les vues que vous avez ajoutées dans la vue de contenu selon vos besoins.

Pour référence :

enter image description here

enter image description here

J'espère que cela vous aidera certainement.

73
Shrikant K

Bien que j'ai finalement réussi à résoudre ce problème et à faire fonctionner les choses. J'ai remarqué que tout ce que je pouvais trouver sur le net en tant que réponses connexes était destiné aux utilisateurs du storyboard. Mais rien à faire par programmation que je pouvais mettre la main.

J'ai donc décidé de créer une application de démonstration extrêmement simple pour montrer comment cela peut être réalisé. J'espère que cela sera utile à quelqu'un à un moment donné.

Voici l'adresse pour l'obtenir sur GitHub: https://github.com/zaxonus/AutoLayScroll

2
Michel

J'ai également utilisé des contraintes par programme pour modifier dynamiquement contentSize d'UIScrollView. J'ai à peu près suivi les instructions de Shrikant mais pour l'étape 2.1, j'ai défini centerX sur scrollViews.centerX plutôt que de définir les marges de début et de fin (aucune idée pourquoi le premier fonctionne, tandis que le second ne fonctionne pas). Puis, comme dernière étape, après avoir ajouté la sous-vue finale, j'ai fait ce qui suit:

contentView.layoutIfNeeded() //set a frame based on constraints
scrollView.contentSize = CGSize(width: contentView.frame.width, height: contentView.frame.height)

J'espère que cela aidera quelqu'un à l'avenir.

1
temlocke