UIScrollView contentSize ne fonctionne pas
J'ai mis un UIScrollView
dans ma plume est view
, et l'a lié à une IBOutlet
propriété.
Maintenant, quand je fais cela dans mon viewDidLoad
méthode, il ne semble pas avoir d'effet sur la contentSize
:
self.sv.backgroundColor = [UIColor yellowColor]; //this works
CGSize size = CGSizeMake(1000.0, 1000.0);
[self.sv setContentSize:size]; //this does not
Il se comporte comme si le contentSize
était la même que l'image. Ce qui se passe?
Cela a commencé à travailler quand j'ai éteint mise en page automatique. Pourquoi?
- setScrollEnabled = OUI?
- Auto-Mise en page peut être une vraie douleur dans le **** parfois
- pouvez consulter ce très bon post pour les explications - ios-tuteur.blogspot.mon/2014/11/...
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème. Mise en page automatique pour
UIScrollView
est foiré.Contourner: tout Mettre dans la
UIScrollView
dans un autreUIView
, et de mettreUIView
comme le seul enfant de laUIScrollView
. Ensuite, vous pouvez utiliser la Mise en page Automatique.Si les choses près de la fin est foiré (la fin de quelle que soit la direction de votre
UIScrollView
manuscrits), changement de la contrainte à la fin pour avoir la plus faible priorité.contentSize
à tous. Exemple ici (tout ce qui est généré dans le code): github.com/mattneub/Programming-iOS-Book-Examples/tree/master/... et ici (tout ce qui est créé dans nib): github.com/mattneub/Programming-iOS-Book-Examples/tree/master/...contentSize
avec mise en page automatique? J'aiscrollView
avec la hauteur dépend de la taille de l'écran. Si l'écran est de 3,5" je suis en train de tout faire rentrer dans les petitesscrollView
. Je suis à la définition de plusieurs contraintes pour les sous-vues défiler vue comme@"V:|-(<=39@500,>=10@500)-[leftView(72)]-(>=3@500,<=20@500)-[loginButton(30)]-0-|"
, mais lecontentSize
est la même pour les deuxscrollView
hauteurs.contentView
manuellement danslayoutSubviews()
J'ai essayé viewWillLayoutSubviews de mettre à jour le scrollView de contentSize, il a travaillé pour moi.
Apple Doc
Appelé à informer la vue contrôleur de son point de vue a tout juste posé ses sous-vues.
Discussion
Lorsque les limites de changement pour une vue du contrôleur de la vue, la vue ajuste les positions de ses sous-vues et ensuite, le système appelle cette méthode. Cependant, cette méthode appelée n'indique pas que l'individu mises en page de l'affichage des sous-vues ont été ajustés. Chaque sous-vue est responsable de l'adaptation de sa propre mise en page.
Votre point de vue contrôleur peut remplacer cette méthode pour faire des changements après le point de vue définit la nature de son sous-vues. L'implémentation par défaut de cette méthode ne fait rien.
La plus facile et la plus propre est la mise en contentSize à viewDidAppear si vous annuler les effets de la mise en page automatique. Cela ne veut pas impliquer l'ajout aléatoire de points de vue. Toutefois, en s'appuyant sur l'ordre de chargement pour une mise en œuvre de travaux ne peut pas être la meilleure idée.
Il y a deux problèmes ici. (1) viewDidLoad est trop tôt; vous devez attendre jusqu'à ce que après la disposition a eu lieu. (2) Si vous souhaitez utiliser la mise en forme automatique avec un scrollview qui vient de la plume, alors vous devez utiliser les contraintes pour décrire complètement la taille de la
contentSize
(et puis vous ne définissez pas lescontentSize
dans le code), ou, si vous souhaitez définir dans le code, vous devez empêcher les contraintes sur la scrollview de sous-vues de dicter lescontentSize
. On dirait que tu voudrais faire plus tard. Pour ce faire, vous avez besoin d'une UIView qui agit comme la semelle de niveau supérieur de sous-vue de la scrollview, et dans le code, vous devez le configurer à pas utiliser la mise en page automatique, permettant à sesautoresizingMask
et le retrait de ses autres contraintes externes. Je montre un exemple de la façon de le faire, ici:https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/ch20p573scrollViewAutoLayout/ch20p573scrollViewAutoLayout/ViewController.m
Mais remarquez aussi l'exemple suivant, qui montre comment utiliser les contraintes complètement, au lieu de
contentSize
.Un moyen SUPER facile à utiliser mise en page automatique avec UIScrollViews à l'intérieur de l'Interface Builder:
Étape 1: Créer un
UIScrollView
Étape 2: Créer un
UIView
qui est un enfant de défilement d'affichage comme suit:(Que nous allons appeler cela un
contentView
).Étape 3: Dans la taille de l'inspecteur, donner ce point de vue en hauteur et en largeur (par exemple, 320x700).
L'étape 4 (en utilisant la mise en page automatique): Créer sans ambiguïté les contraintes de votre
contentView
à son superview (leUIScrollView
): connecter les 4 bords (haut, leader, suiveur, en bas), puis donnez-lui un défini la largeur et la hauteur que vous souhaitez faire défiler trop.Par exemple: Si vos faites défiler la vue s'étend sur la totalité de l'écran, vous pouvez donner à votre contenu en vue d'une largeur de [appareil largeur] et d'une hauteur de 600; il sera alors définir la taille du contenu de la
UIScrollView
de match.OU:
L'étape 4 (n'utilisant pas de mise en page automatique): Connecter à la fois de ces nouveaux contrôles à votre vue-contrôleur à l'aide de l'IB (ctrl+glisser de chaque contrôle de votre vue du contrôleur .h @mise en œuvre). Supposons que chacun est appelé
scrollView
etcontentView
, respectivement. Il devrait ressembler à ceci:L'étape 5 (n'utilisant pas de mise en page automatique): Dans la vue du contrôleur .h fichier ajouter (en fait, remplacer) la méthode suivante:
Utiliser ce code. Le ScrollView setContentSize doit être appelé asynchrone dans le thread principal.
Swift:
Objectif C:
Vous pouvez utiliser ces lignes de code dans votre *.m du fichier
pour cela, vous devez prendre un IBOutlet propriété de UIScrollView dans votre *.h fichier de cette façon:
Se connecter à partir de Storyboard.
Ou,
Vous pouvez utiliser cette méthode dans votre *.m fichier:
Cette solution fonctionne pour moi en xcode-5, xcode-6, xcode-6.1, xcode-6.2
Réglage de la contentSize dans
viewDidAppear
est critique.Mais j'ai eu aussi une variante de ce qui a fonctionné dans l'écran de 3,5 pouces de l'écran, et les 4 pouces de l'écran. Les 4 pouces de l'écran travaillé, le plus âgé n'a pas. Les deux iOS 7. Bizarre, c'est un euphémisme!
J'ai enfin mon propre solution à ce problème parce que dans mon cas je ne pouvais pas utiliser le point de vue du contrôleur de cycle de vie. Créez votre propre défilement de l'affichage de la sous-classe et l'utiliser à la place de UIScrollView. Cette même travaillé pour un défilement de vue à l'intérieur de la vue d'une collection de cellules.
Mon MyScrollView a été défini dans la plume avec une étiquette de 90. Si donc c'est une bonne façon de définir la taille du contenu dans le code de la vue parent.
Je n'ai jamais pu obtenir la mise en page automatique basée sur les contraintes de travail. Depuis mon point de vue était déjà une sous-classe UIScrollView je l'ai résolu en remplaçant setContentView: et en ignorant automatique des mises en page zéro hauteur setContentSize: message.
J'ai utilisé pour faire configurer le uiscrollview par programmation JUSQU'à ce que j'ai regardé la suite de merveilleux tutoriel, étape par étape, comment obtenir uiscrollview et uiview de travail: https://www.youtube.com/watch?v=PgeNPRBrB18
Après avoir regardé la vidéo, vous allez commencer à aimer Interface Builder, j'en suis sûr.
De voter
Si vous utilisez
AutoLayout
vraiment un moyen simple de définir lecontentSize
d'unUIScrollView
est juste pour ajouter quelque chose comme ceci:Pas encore la vitesse de défilement dynamique de la hauteur des étiquettes dépasse vue la hauteur.
J'ai fait ce que yuf de réponse comme correcte ci-dessus dit de le faire (j'ai ajouté un affichage du contenu de mon scrollview et de définir les contraintes leader de, de fuite, de haut en bas, et de l'égalité des largeurs à partir de l'affichage du contenu pour le défilement de l'affichage.) mais toujours de mon point de vue n'a pas été le défilement lorsque les contrôles internes de la hauteur de dépassement de la hauteur de la scrollview.
À l'intérieur le contenu de mon point de vue, je disposer d'une image et 3 étiquettes en dessous. Chaque étiquette ajuste leur propre hauteur dépend de la façon dont beaucoup de texte est en eux (ils sont en word-wrap et numberoflines = 0 pour y parvenir).
Le problème que j'avais était mon affichage du contenu de la hauteur n'a pas été le réglage dynamique de la hauteur de l'étiquette lorsqu'ils ont dépassé la hauteur de défilement de la vue/vue principale.
Pour résoudre ce problème que je libellée en sortir, j'ai besoin de définir le Bas de l'Espace de Conteneur contrainte entre mes bas de l'étiquette et de la contentview et lui a donné une valeur de 40 (choisi arbitrairement pour lui donner une belle marge en bas). Cela signifie maintenant que mon contentview ajuste sa hauteur, alors qu'il y a un espace entre le bas de la dernière étiquette et de lui-même et il défile parfaitement!
Yay!
Essayer...
ajouter toutes les contraintes comme vous le faites pour
UIView
(Voir la capture d'écran de mon ViewControler en Storyboard)Maintenant le truc commence. sélectionnez votre dernier objet et sélectionnez son fond de contrainte. (Voir capture ci-dessus, Instagram bouton du Bas de la Contrainte(ligne Jaune)) et Changement de la Constante dans la Taille de l'Inspecteur comme dans le soufflet capture d'écran.
j'ai besoin Constant=8 mais vous pouvez le modifier selon vos besoins.
cette Constante est l'Espace entre le Bouton Orange du Fond et de la scrollView.
MODIFIER
Assurez-vous au sujet de votre point de vue de la hiérarchie .
0) ViewController.affichage (facultatif)
1) UIScrollView
2) UIView (Renommez-le en "contentView")
3) UIView (ce point de vue, c'est le contenu qui fera scrollView de défilement)
Je me suis mise en page automatique de travailler pour paginé de défilement des vues dont les pages occuper la totalité de la largeur de l'écran. Les pages redimensionner automatiquement selon le défilement de la vue de la taille. Je n'ai pas testé cette moindre largeur de défilement de la vue, mais aussi de faire un commentaire là, si il fonctionne, je beleieve il se doit. Ciblée pour iOS 9, écrit le code dans Swift 2, utilisé un mélange de l'IB et du code personnalisé dans
awakeFromNib
.Suit:
UIView
(j'ai appelé le miencontentView
) dont le sommet, de fuite, en bas et sur les bords d'attaque pour le défilement de la vue sont toutes à zéro; la hauteur est égale à la de défilement de la vue; mais la largeur est le défilement de l'affichage de la largeur multipliée par le nombre de pages. Si vous faites cela visuellement, vous verrez votre contenu en vue de s'étendre au-delà de votre barre de défilement de la vue dans Interface Builder.contentView
, ajouter des règles de mise en page automatique pour les mettre côte à côte les uns des autres, mais le plus important, leur donner à chacun une contrainte de sorte que leurs largeurs sont identiques pour le défilement de la vue, et non pas le contenu de la vue.Exemple de code ci-dessous.
embedChildViewController
est juste ma méthode pratique pour l'ajout de l'enfant VCs-ne regardezsetupLayoutRulesForPages
. J'ai exactement deux pages, donc la fonction est trop simple, mais vous pouvez l'étendre à vos besoins.De mon point de vue contrôleur:
Ma vue personnalisée: