62 votes

UIScrollView contentSize ne fonctionne pas

Je suis sûr que cela fonctionnait avant, mais maintenant.. il n'est pas.

J'ai mis un UIScrollView dans ma plume, et elle est reliée à un IBOutlet de la propriété.

Maintenant, quand je fais cela dans mon viewDidLoad, 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 est le même que le cadre de la.. qu'est-ce qui se passe?

EDIT: Cela a commencé à travailler quand j'ai éteint mise en page automatique.. pourquoi ô pourquoi ô pourquoi?

85voto

yuf Points 1038

J'ai eu le même problème. Mise en page automatique pour UIScrollView est foiré.

Travail autour de: de tout Mettre dans la UIScrollView dans un autre UIView, et mettre une UIView comme le seul enfant de la UIScrollView. 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é.

71voto

HDdeveloper Points 1439

J'ai essayé viewWillLayoutSubviews de mettre à jour le scrollView de contentSize, il a travaillé pour moi.

- (void)viewDidLayoutSubviews
{
  [self.bgScrollView setContentSize:CGSizeMake(320, self.view.frame.size.height* 1.5)];
}

Apple Doc

-(void)viewDidLayoutSubviews

Appelé aviser le point de 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.

21voto

Jlam Points 552

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.

15voto

remus Points 6305

Un moyen SUPER facile à corriger cela lors de l'utilisation de l'Interface Builder (IB):

Étape 1: Créer un UIScrollView

Étape 2: Créer un UIView qui est un enfant de défilement d'affichage comme suit:

-UIScrollView
---UIView
-----Your other content

Étape 3: Dans la taille de l'inspecteur, donner ce point de vue en hauteur et en largeur (par exemple, 320x700).

Étape 4: 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 et contentView, respectivement. Il devrait ressembler à ceci:

@interface YourViewController : UIViewController

@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@property (strong, nonatomic) IBOutlet UIView *contentView;

@end

Étape 5: Dans la vue du contrôleur .h fichier ajouter (en fait, remplacer) la méthode suivante:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.contentView.frame.size;
}

Je devrais également mentionner, cela fonctionne avec ou sans contraintes; ne vous sentez pas le besoin d'aller de l'ajout dans la marge et la broche de contraintes.

14voto

matt Points 60113

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 l' contentSize (et puis vous ne définissez pas l' contentSize dans le code), ou, si vous souhaitez définir dans le code, vous devez éviter les contraintes sur le scrollview de sous-vues de dicter l' contentSize. 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 à ne pas utiliser la mise en page automatique, permettant à ses autoresizingMask 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X