Le calcul de contentSize pour UIScrollView lors de l'utilisation de Mise en page Automatique
Voici une petite question à propos de quelque chose qui fonctionne, mais qui pourrait être écrit beaucoup mieux. J'ai un UIScrollView
et une liste des objets placés à l'intérieur, l'une sous l'autre. Tout est fait au cours de viewDidLoad()
et le placement des objets utilise Auto Layout
. Voici ce que je fais pour régler le contentSize
hauteur de la 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)
}
Il fonctionne, mais la valeur arbitraire de 1,59 a évidemment été décidé par moi-même en essayant un peu de valeurs possibles. Quelle est la bonne manière de calculer l'contentSize dans un tel cas? Je suis tout a fais de la programmation.
Recherche sur le net ne m'a pas entraîné toute simple et claire réponse, donc eventhough il peut être un peu double question, j'ai décidé de le reformuler.
Vrai, mais la plupart (tous) d'entre eux suppose que vous utilisez storyboard 🙂
Si vous ajoutez des sous-vues de code, vous pouvez probablement juste aller à la Taille de l'Inspecteur, sélectionnez l'Ambiguïté->ne Jamais Vérifier en bas.
Pela : C'était il y a longtemps, mais de toute façon voir ma solution préférée, si vous êtes intéressé. Recherchez AutoLayScroll dans l'une des réponses ci-dessous.
OriginalL'auteur Michel | 2016-08-15
Vous devez vous connecter pour publier un commentaire.
Donnant la taille du contenu par programmation n'est pas de la bonne façon. La solution ci-dessous
travail en utilisant une mise en page automatique, pas besoin de définir la taille du contenu à tous. Il calculera comme par
combien d'UI champs ajoutés à la vue.
Étape 1 :
Ajouter le Scrollview à afficher dans le storyboard et d'ajouter, en fin de chaîne, en haut et en bas des contraintes
(Toutes les valeurs sont égales à zéro).
Étape 2 :
Ne pas ajouter directement des vues dont vous avez besoin directement sur le scrollview, ajoutez d'Abord un point de vue
pour le scrollview (qui sera notre affichage du contenu pour tous les éléments de l'INTERFACE utilisateur).
Ajouter ci-dessous les contraintes de ce point de vue.
1) chef de file, derrière, en haut et en bas des contraintes
(Toutes les valeurs sont égales à zéro).
2) Ajouter la même hauteur, de largeur égale à la vue Principale (c'est à dire qui contient le scrollview).
Pour l'égalité de la hauteur de définir la priorité la plus basse. (C'est l'étape importante pour le réglage de la taille du contenu).
3) la Hauteur de ce contenu sera fonction du nombre de vues, ajouté à la vue.
disons que si vous avez ajouté dernier point de vue est une étiquette et de sa position Y est de 420 et hauteur
est 20 alors votre contenu sera 440.
Étape 3 : Ajouter des contraintes à tous points de vue que vous avez ajouté dans l'affichage du contenu selon vos besoins.
Pour référence :
J'espère que ce sera certainement vous aider.
Son affichage normal, j'ai ajouté à scrollview (et en le traitant comme contentView). Alors sur ce point de vue, je suis en plaçant tous les éléments de l'INTERFACE utilisateur.
Je l'ai enfin fait, il fonctionne de la programmation, de la manière que je veux. Mais je ne suis toujours pas sûr de savoir comment ce contentview ça marche. Ce qui va se passer si j'ajoute 3 sous-vues avec la taille différente? Qui sera considéré comme l'affichage du contenu?
Super ! Si vous souhaitez ajouter 3 points de vue dans le scrollview alors ce que je fais est de prendre un point de vue (qui contiendra les 3 vues) et l'ajouter à la scrollview. Thats it. (Je l'ai mentionné dans l'exemple ci-dessus)
C'est la meilleure réponse que j'ai vu jusqu'à maintenant en ce qui concerne ce sujet! Mais il y a un autre cas: si la somme de mon point de vue en hauteur + marge est inférieure à l'espace disponible, de la même hauteur contrainte de victoires, de sorte que, lorsque le clavier apparaît et j'ai mis l'encart égal à clavier, la hauteur, je peux faire défiler vers le bas de façon trop. Comment cette situation peut être abordée?
OriginalL'auteur Shrikant K
Mais j'ai finalement réussi à résoudre ce problème et de faire fonctionner les choses.
J'ai remarqué que tout ce que je pouvais trouver sur le net que des réponses a été réalisé au storyboard utilisateurs. Mais rien à faire par programmation que j'ai pu mettre mes mains sur.
J'ai donc décidé de faire une très simple démo app pour montrer comment cela peut être réalisé. J'espère que ce sera utile à quelqu'un à un certain point.
Voici l'adresse pour la mettre sur GitHub:
https://github.com/zaxonus/AutoLayScroll
Ce qui est excellent. Plusieurs jours à essayer des choses et c'est la seule qui a fonctionné. Remarque, les œuvres de Swift 3, compte tenu de la variable de changement de nom. Je vous remercie monsieur.
Merci! Cet exemple est excellent!
Je pense que vous pouvez utiliser un
UIStackView
épinglé dans toutes les directions à laUIScrollView
au lieu de cela.OriginalL'auteur Michel
J'ai aussi utilisé des contraintes du programme, afin de modifier dynamiquement UIScrollView de contentSize . J'ai à peu près suivi Shrikant les instructions, mais pour l'étape 2.1, j'ai mis centerX à la scrollViews.centerX plutôt que de créer de l'attaque et de fuite des marges (Aucune idée de pourquoi l'ancien, alors que ce dernier n'a pas). Puis, comme une dernière étape, après l'ajout de la finale de la sous-vue, je n'ai suivantes:
Espère que cela aide quelqu'un dans le futur.
OriginalL'auteur temlocke