Comment puis-je utiliser la mise en forme automatique afin de définir des contraintes sur ma UIScrollview?
J'ai passé deux jours à essayer les différentes solutions pour Mixtes et Pures mise en page automatique des approches pour réaliser ce qui a été une mince scrollview de l'installation avant la mise en forme automatique, et c'est maintenant officiel: je dois être trop bête. Je suis cette mise en place principalement dans le Storyboard (bon, c'est juste la façon dont il est).
Voici donc mon appel à l'aide.
Viewtree:
UIView
-UIView
-UIView
..-UIScrollview
...-UIButton
...-UIButton
...-UIButton
Les boutons sont censés pour faire défiler horizontalement (de gauche à droite et vice-versa). Quelqu'un peut-il veuillez laissez-moi savoir comment définir les contraintes pour réaliser cela à l'aide de pure mise en forme automatique???
--
J'ai essayé de l'approche mixte, comme suit:
UIView
- UIView
- UIView
..-UIScrollview
...-UIView (contentview)
....-UIButton
....-UIButton
....-UIButton
...et paramètre fixe la largeur et la hauteur des contraintes pour le contentview
et la translatesAutoresizingMaskIntoConstraints
paramètres comme par Apple note technique. Les boutons et le scrollview sont mis en place à l'aide de contraintes. Cela devient la scrollview de défilement (yay), mais hélas, ça défile trop loin! Aussi loin que je peux dire, le défilement largeur est en quelque sorte doublé de ce que j'ai mis le contentview à???!!!???
J'ai essayé de la pure mise en forme automatique approche, à la fois avec contentview
et sans. Tous les points de vue sont translatesAutoresizingMaskIntoConstraints=NO
, sauf pour self.view
. Les boutons ont une largeur fixe/contraintes de hauteur, et sont épinglés à tous les quatre bords de la scrollview. Rien de parchemins.
Donc je suis totalement perplexe pourquoi je ne peux pas le faire fonctionner correctement. Toute aide est très appréciée, et si vous avez besoin d'autres infos, merci de demander!
Mise à JOUR de Capture d'écran avec la solution
buttonZ contraintes:
EDIT @ Jamie Forrest
Si la solution s'avère être le tort de fuite contrainte sur le dernier bouton. Au lieu de 6441, la valeur que j'avais mis était négatif, -6441. La chose la plus délicate est, que lors de la fixation de la valeur dans la table de montage séquentiel, il y a deux options dans le code Pin de la barre d'outils:
Le dessin Actuel de la Valeur est négative (ne menant à aucune de défilement), et l'option ci-dessous est positif (activation de défilement). Cela signifie que je ne suis pas stupide, mais au moins à moitié aveugle, je suppose. Bien que, pour ma défense, n'est-ce pas un peu inquiétant que XCode n'indique pas une erreur pour la "mauvaise" la mise en?
RÉÉDITÉ
Maintenant, c'est drôle... en changeant le point à la valeur de -6441 (pas de défilement) pour 6441 permis de défilement. Mais mon vieil ami, le "trop de contentsize" était de retour, conduisant à un contenu de taille deux fois plus grande que ce qu'elle devrait être! La solution pour obtenir le contenu de défilement a été de mettre le point à la contrainte à ZÉRO! Ce n'est pas évident lorsque l'on travaille dans le Storyboard, mais en regardant @l'Infini-Jacques-de-code, c'est ce qu'il devrait être.
- Où voulez-vous calculer/définir la taille du contenu pour votre défilement de la vue? Se référant à votre première tentative à l'aide d'un contentView et vous avez dit qu'il défile trop loin.
- Autant que je sache, vous ne pouvez pas définir la
contentSize
d'unUIScrollView
utilisant seulement la mise en page automatique. Et c'est lecontentSize
qui définit la façon dont beaucoup vous pouvez faire défiler. De sorte que vous aurez à régler manuellement quelque part finalement. Pour le reste, vous pouvez utiliser la mise en page des contraintes pour configurer l'affichage des cadres les uns par rapport aux autres. - la taille du contenu est fixe, il ne change jamais. J'ai défini la taille du contenu dans la table de montage en tapant la bonne hauteur et de la largeur de la contentiview à la main, et je la broche de la hauteur et la largeur de contraintes dans le storyboard.
- Imprimer votre contentSize au moment de l'exécution, voir si elle correspond à des valeurs que vous avez entrée. Le contentSize détermine combien de défilement se produit, de sorte que le problème avec votre première tentative est de faire avec contentSize.
- ainsi, le "pure mise en forme automatique" approche n'est pas que pure après tout? Mais COMMENT puis-je régler l'contentSize manuellement? Comme je l'ai mentionné ci-dessus, je suis réglage de la hauteur/largeur de l'affichage du contenu à valeur fixe (dans le scénario). Mais ça défile trop loin (2x).
- Je comprends que. Évidemment, si la contentsize est la bonne, il serait faire défiler correctement. Le problème que je suis en train de décrire est: comment définir la contentsize correctement? Apple TechNote semble contourner le problème en utilisant une imageview, ou alors il se sent. Je vais ouvrir une session le contentsize et de répondre ici peu de temps.
- Pour définir manuellement le faire:
scrollView.contentSize = CGSizeMake(THE_SIZE_OF_THE_CONTENT,self.scrollView.frame.size.height);
- le contentsize est enregistrée en tant que double de celui que j'ai mis le contentview.la largeur. Depuis qu'il défile deux fois plus loin, c'est évident, je suppose. La question est, pourquoi ne le faites défiler deux fois plus loin si je définis la largeur de la contentview à la moitié de celui-ci?
- Gène, cela ne fonctionne pas avec de la pure mise en page automatique, mais oui, c'est ce que j'ai utilisé pour l'approche mixte.
- oui, mais vous avez demandé comment le configurer manuellement.
- Vidéo tutoriel: youtube.com/watch?v=4oCWxHLBQ-A
- La solution parfaite! --> "La solution pour obtenir le contenu de défilement a été de mettre le point à la contrainte à ZÉRO! Ce n'est pas évident lorsque l'on travaille dans le Storyboard
- Je préfère la vieille question de titre.
Vous devez vous connecter pour publier un commentaire.
Il est difficile de voir les valeurs exactes et la configuration de vos contraintes que vous avez collé ici, donc je ne suis pas sûr de regarder vos captures d'écran où vous êtes allé mal.
Au lieu d'une explication de ce qui est mal dans votre installation, j'ai créé une base de exemple de projet avec très semblable à la vue de la hiérarchie et de la contrainte de l'installation de celui que vous décrivez. Le défilement horizontal fonctionne comme prévu dans l'exemple de projet qui utilise la "Pure mise en forme automatique" approche qu'Apple décrit dans le Note Technique.
J'ai aussi eu beaucoup de problèmes à l'origine, l'obtention de Disposition Automatique de travailler avec
UIScrollView
. La clé pour obtenir pour fonctionner est de s'assurer que tous les éléments dans le défilement de la vue, pris ensemble, ont des contraintes que, finalement, le lien de tous les côtés de défilement de la vue et à contribuer à la mise en page automatique système soit en mesure de déterminer un contentSize pour le défilement de la vue qui sera plus grand que son cadre. On dirait que vous essayez de le faire dans votre code, mais peut-être que vous avez eu quelques superflu contraintes qui ont fait le contentSize trop petit.Également de noter, comme d'autres l'ont mentionné, avec mise en page automatique et UIScrollview, vous n'avez plus à régler la contentSize explicitement. La mise en page automatique Système calcule la contentSize basé sur vos contraintes.
J'ai aussi trouvé cet ebook chapitre être très utile en me faisant comprendre comment tout cela fonctionne. Espérons que tout cela aide.
LOL bienvenue à la stupidité du club. Je suis l'un des fondateurs. 😀
Pour le défilement VERTICAL: la seule façon que je pouvais le faire fonctionner (iOS 8, Xcode 6 et pure mise en forme automatique) a été adjonction de contraintes à mon Scroll View (toutes liées à la superview):
Ma structure:
C'est le résultat final:
C'est le programme d'installation:
Plein écran
J'espère que cela permettrait de sauver quelqu'un d'ALLER DORMIR À 5 heures du matin. 😀
Simple Autonome Exemple
À en juger par le nombre élevé de votes sur la question et le faible nombre de votes sur les réponses, les gens ne sont pas trouver une façon compréhensible et rapide solution ici. Permettez-moi d'essayer d'en ajouter un. Ce projet est un exemple réalisé entièrement dans Interface Builder. Vous devriez être en mesure de travailler à travers elle dans 10 minutes ou moins. Ensuite, vous pouvez appliquer les concepts que vous avez appris à votre propre projet.
L'original question porte sur les boutons de défilement. Ici je viens d'utiliser
UIView
s, mais ils peuvent représenter quelle que soit vous le souhaitez. J'ai aussi choisi de défilement horizontal, car la table de montage séquentiel des captures d'écran sont de plus en plus compacts pour ce format. Les principes sont les mêmes pour le défilement vertical, cependant.Concepts clés
UIScrollView
ne doivent utiliser qu'une sous-vue. Il s'agit d'une UIView " qui sert d'affichage de contenu pour contenir tout ce que vous souhaitez faire défiler.Démarrer un nouveau projet
C'est peut être juste une vue unique de l'application.
Storyboard
Dans cet exemple, nous allons faire un défilement horizontal de la vue. Sélectionnez le point de Vue du Contrôleur, puis choisissez Libre dans la Taille de l'Inspecteur. Faire de la largeur
1,000
et la hauteur300
. Cela nous donne juste place sur la table de montage séquentiel pour ajouter du contenu qui va faire défiler.Ajouter un Scroll View
Ajouter un
UIScrollView
et la broche de tous les quatre côtés à la vue de la racine de la vue-contrôleur.Ajouter un Affichage de Contenu
Ajouter un
UIView
comme une sous-vue de défilement de la vue. C'est la clé. N'essayez pas d'ajouter beaucoup de sous-vues pour le défilement de l'affichage. Il suffit d'ajouter une seuleUIView
. Ce sera votre vue de contenu pour les autres points de vue que vous voulez faire défiler. Broche de l'affichage du contenu de défilement de la vue sur les quatre côtés.Des Hauteurs Égales
Maintenant dans le plan du Document, Commande cliquez sur à la fois le contenu et la vue de défilement de la vue vue parent afin de les sélectionner à la fois. Puis définissez les hauteurs à l'égalité (Contrôle faites glisser à partir de l'Affichage du Contenu pour le Défilement de l'Affichage). C'est également un élément clé. Parce que nous sommes de défilement horizontale, le défilement de l'affichage du contenu en vue de ne pas savoir comment il devrait être, à moins que nous l'avons créé de cette façon.
Remarque:
Ajouter du contenu
Ajouter trois
UIView
s et de leur donner toutes les contraintes. J'ai utilisé 8 points marges pour tout.Contraintes:
Réglage de la largeur de contraintes est également clé de sorte que le défilement de l'affichage sait quelle est la largeur de son contenu sera.
Fini
C'est tout. Vous pouvez exécuter votre projet dès maintenant. Il devrait se comporter comme le défilement de l'image en haut de cette réponse.
Pour le défilement vertical, il suffit de le remplacer toute la largeur et la hauteur des directions dans cet exemple (testé et de travail).
De Poursuivre L'Étude De
La contentSize est implicitement défini par l'application de contraintes à l'intérieur de la UIScrollView.
Par exemple, vous avez un UIScrollView à l'intérieur d'une UIView, il ressemblera à ceci (je suis sûr que vous connaissez):
Qui va définir la scrollView pour remplir la taille de la containerView (donc le containerView devra être d'une certaine taille).
Vous pouvez ensuite ajuster la contentSize de la UIScrollView par implicitement un réglage à être assez grand pour contenir les boutons comme ceci:
Il ya tellement de nombreuses questions sur l'utilisation de la mise en page automatique avec UIScrollView, le point clé qui nous ignorent, c'est que l'intérieur des vues de la UIScrollView faire de contraintes à l'encontre de la d'Affichage de Contenu mais pas le UIScrollView lui-même. Reportez-vous à la Note technique TN2154, vous pouvez trouver:
L'illustration suivante montre que:
Vous pouvez trouver l'espace arrière est de 500 points, si la contrainte est faite à la UIScrollView, l'affichage va être miss placé et devrait être mise à jour de son cadre. Cependant, aucun avertissement et sans erreurs. Parce que toutes les contraintes sont contre l'affichage du contenu.
UIScrollView permettra de calculer la taille de l'affichage du contenu en fonction des contraintes de l'intérieur de la vue. (Pour l'exemple, le contenu taille: largeur = 100(espace) + 200 (vue de largeur) + 500 (espace arrière), hauteur = 131 (en haut de l'espacement) + 200(hauteur) + 269(espacement)
Comment ajouter des contraintes pour les vues dans le UIScrollView:
Et tout ce qu'il fait.
Un moyen facile de traiter avec mise en page automatique avec le scrollview est d'ajouter un conteneur contenant tous les sous-vues dans le défilement de la vue.
Conclusion: le point clé pour comprendre la mise en page automatique avec UIScrollView est intérieure vue sur les contraintes à l'encontre de l'affichage du contenu, mais pas UIScrollView lui-même.
attaché exemple de code
La solution suivante a fonctionné pour moi pour scrollView avec mise en page automatique et sans contentSize:
Et vous avez terminé. Maintenant, vous pouvez ajouter n'importe quel nombre de contrôles sur ce point de vue et d'appliquer les contraintes pertinentes les unes aux autres (qui ne semblent pas travailler sans ce point de vue). Si vous ne voulez pas utiliser de ce point de vue, alors vous aurez à appliquer des contraintes pour chaque contrôle liées à la scrollView (pas liés les uns aux autres).
L'écrasante astuce..............
Critique. Disons que pour la clarté de la UIScrollView est 1000 de large et 100 de hauteur. (En fait, normalement, ces valeurs seraient dynamique, bien sûr, en fonction de la largeur de l'appareil etc. Mais pour l'instant juste dire 1000 de large et 100 de hauteur.) Disons que vous faites un de défilement horizontale. De façon à mettre une UIView à l'intérieur de la UIScrollView. (C'est le "contenu" de la vue".) Ensemble tous les quatre contraintes de l'affichage du contenu en haut, en bas, leader, suiveur, le défilement de l'affichage. Rendre tout de zéro, même si cela semble mauvais. Régler la hauteur du contenu UIView à 100 et oublier que. Maintenant: vous voulez faire défiler horizontalement, afin de régler la largeur de l'affichage du contenu à être disons 1225.
Noter que la largeur de l'affichage du contenu est maintenant à 225 plus grand que la largeur de la mère de défilement de la vue. C'est OK: en fait, vous DEVEZ le faire. Notez que
...vous ne PAS définir le point à la largeur de négatif 225...
vous pensez que vous avez à "match" les largeurs comme vous le feriez normalement. Mais si vous le faites, il ne fonctionnera pas du tout.
Vous devez définir l'attaque et de fuite des numéros de ZÉRO, jamais négatif (même si la largeur est plus "large")
Intéressant, vous pouvez réellement le avant/après des chiffres dans toute positif valeur (essayez de dire "50") et il vous donne une sorte de marge de rebond. (Souvent, il ressemble beaucoup: l'essayer.) Une valeur négative à l'une des extrémités sera "en silence, briser".
Noter que, infuriatingly, souvent Xcode (comme des 7.3.1 de toute façon),
sera 'gentiment' ensemble de ces valeurs pour vous de nombres négatifs!
parce qu'il tente automatiquement de le calculer pour vous. Si donc il en silence pause. Ensemble tous les quatre valeurs à zéro en première instance. Et de définir la largeur de l'affichage du contenu beaucoup plus large que les "1000" dans l'exemple.
Édité:
J'ai fini avec l'aide de UITableView au lieu de UIScrollView pour la plupart de mes besoins. Comme tableView me semble beaucoup plus souple et dynamique.
Je suppose que vous rencontrez des problèmes avec le
contentSize
. Découvrez ce blog sur la façon de gérer lacontentSize
lors de l'utilisation d'un "pur" approche de mise en page automatique. L'essentiel, c'est que vos contraintes définissent implicitement la taille du contenu. Vous n'avez JAMAIS la définir explicitement lors de l'utilisation de mise en page automatique. J'ai attaché exemple de projet à la fin de l'article du blog pour vous montrer comment il fonctionneIl y a un morceau dans la tech notes que vous avez peut-être regardé de plus. Vous pouvez implicitement défini la taille du contenu d'un défilement de l'affichage à l'aide de contraintes fixées sur les bords de défilement de la vue.
Voici un exemple simple. Créer un storyboard avec un point de vue, qui a un défilement de l'affichage. Jeu de défilement des vues contraintes à l'adapter à la taille de la vue que vous mettez dans.
À l'intérieur que de défilement en vue d'ajouter une seule vue. Définir explicitement la taille de ce point de vue à l'aide de contraintes (et assurez-vous que la taille est plus grande que le défilement de l'affichage).
Maintenant ajouter quatre autres contraintes à l'intérieur verrouillage de la vue, les quatre bords du point de vue interne à son parent de défilement de la vue. Ces quatre contraintes cause de la taille du contenu de l'étendre à accueillir le point de vue interne.
Si vous avez plusieurs points de vue que vous souhaitez ajouter à un défilement de l'affichage, par exemple disposés horizontalement, vous souhaitez verrouiller le côté gauche de la première sous-vue à la gauche du défilement de l'affichage, verrouillage de la sous-vues à l'horizontale, et le côté droit de la dernière sous la vue sur le côté droit de défilement de la vue. Ces contraintes serait forcer la taille du contenu de défilement de la vue de développer pour s'adapter à tous les sous-vues et à leurs contraintes.
Si votre question est "Comment puis-je mettre un tas de UITextFields dans un défilement vertical UIScrollView tels qu'ils se déplacent hors de la voie du clavier lors qu'ils ont le focus", la meilleure réponse est:
Ne pas.
Utiliser un UITableViewController avec des cellules statiques au lieu.
Vous obtenez ce parchemin-out-of-the-way comportement pour gratuit, ET de tout le contenu des encarts de Travail Juste si votre vue-contrôleur est affiché à l'intérieur d'un UINavigationController.
Vous devez organiser votre mise en page comme ceci
ViewControllerView
contientScrollView
,ScrollView
contientContainerView
,ContainerView
contient 2Labels
Puis suivez les 3 étapes pour faire de votre
ScrollView
pouvez faire défilerScrollView
pin (haut/droite/bas/gauche) pourViewControllerView
ContainerView
pin (haut/droite/bas/gauche) pourScrollView
Horizontally in Container
(ne pas ensembleVertically in Container
)Label1
pin (haut/droite/gauche) pourContainerView
Label1
pin (droite/gauche/bas) àContainerView
et haut àLabel1
Espérons que cette aide
La pure mise en forme automatique approche fonctionne à merveille, mais il est assez compliqué à mettre en place si vous êtes à la migration de la non-mise en page automatique. Je l'ai fait quelques fois et j'ai quelques conseils généraux:
Après un certain temps de régler cette question, j'ai finalement trouvé une solution. Je travaille avec une classe universelle tailles des story-boards (600x600). J'ai créé une UIView (contentView) la taille de la scrollView et créé des contraintes en Haut, en Bas, avant et arrière de la scrollView. Ensuite, j'ai tondu la manuellement la taille de la contentView de 600x600. Le storyboard cessé d'essayer de redimensionner tout et je pourrais travailler, mais la vue regardé terrible sur le périphérique réel ou simulateur.
J'ai fait 2 contrainte de débouchés de cette coupées tailles.
Puis dans le viewDidLoad
Fonctionne très bien.
J'ai passé des jours à essayer de trouver une solution de comment utiliser la mise en forme automatique de la vue d'un intégré le Scrollview, au centre de la scrollview dans le visible à l'écran, qui fonctionne sur tous les appareils /les dimensions de l'écran ainsi qu'avec la rotation de l'écran.
J'ai passé des jours à essayer de le faire avec mise en page automatique seulement, et a obtenu près mais jamais assez proche. Donc à la fin j'ai dû ajouter 3 lignes de code par l'écran, dans le viewDidLoad.
Voir la solution ci-dessous :
Maintenant, allons à la .m fichier et ajouter ces lignes de code dans le viewDidLoad (jouer avec le rembourrage montant pour obtenir le vert de centrage)
{
auto.constraintVertVtoSV.constante = 150.0;
}
cela devrait maintenant fonctionner sur tous les appareils et être correctement centré et encore de faire défiler correctement.
Si comme moi il vous suffit d'utiliser le contenu statique sans counstraints à l'intérieur de la sous-vue, comme vous pouvez le faire comme ceci:
Problème similaire, je vais avoir aujourd'hui avec iOS 8.4, Xcode 6.4
Il y a une vue contenant un parchemin de vue, contenant un contentView (UIView) contenant des sous-vues.
Tout est à disposition automatique de partout.
La scrollview bords sont épinglés à la mère des vues sur les bords avec des contraintes.
L'affichage du contenu bords sont épinglés sur le défilement de l'affichage des bords avec des contraintes.
À l'origine, le contenu de vue refuser la taille de la largeur de défilement de la vue. J'ai dû ajouter une contrainte supplémentaire sur le contenu en vue de sa largeur correspondre à la mère de défilement de la vue. Ou je pourrais définir un contentView.centerX == scrollView.centerX contrainte. Soit l'un de ceux qui en plus d'épingler les bords tout d'un coup le contenu s'afficher correctement la taille.
Épingler les bords de l'affichage du contenu pour le défilement de l'affichage à l'aide de visual contraintes de la forme,
J'utilise une routine pour parcourir le tableau et les ajouter à la scrollView.
J'ai fait face à un problème similaire. J'ai mis toutes les contraintes et était toujours demandé pourquoi il encore redimensionne certains des sous-vues. Ma solution a été de mettre clipsToBounds OUI.
Dans swift vous pouvez utiliser cette solution de travail.
Contraintes
ScrollView
: Leader, Suiveur, Haut, Bas = SuperviewContentView
: Leader, Suiveur, Haut, Bas = ScrollView. Hauteur fixe de/par rapport au contenu.Vous pouvez définir la largeur de la contrainte(contentView) à l'égalité de scrollviews superview, mais sélectionnez supprimer pour supprimer sur le temps de construction parce que vous serez l'ajout de cette contrainte par programmation. C'est juste pour l'IB ne se plaint pas avec des avertissements.
Et de l'avis du Contrôleur
viewDidLayoutSubviews
je viens d'appeler cette méthode:Je sais que c'est un profane de la solution et non pas ce qu'Apple propose dans le docu, mais il a travaillé pour moi deux fois, avec un contenu différent et peut être mis en place très rapidement:
Dans la vue storyboard contrôleur insérer UIView.
Dans UIView insérer une Vue de Table, Dynamique, 0 Prototype de cellules, le Style simple ou Groupé.
Dans la Vue Tableau insérer un Défilement de l'Affichage,
faites Défiler jusqu'Vue insérer du contenu.
C'est ça, pas de paramètres dans la vue personnalisée contrôleur.