UIScrollView ne défile pas indépendamment du contenu important

J'ai créé un UIScrollView et ajouté des sous-vues dans Interface Builder, mais je n'arrive pas à le faire défiler. J'ai examiné d'autres questions similaires, mais j'ai défini mon contenu de manière appropriée. En fait, j'ai même essayé de définir incroyablement grand contentSize et cela ne fait pas la différence. Qu'est-ce que je rate? Notez que l'UIScrollView est un IBOutlet:

@property (strong, nonatomic) IBOutlet UIScrollView *scroll; 

C'est à mon avisDidLoad:

 self.scroll.scrollEnabled = YES; [self.scroll setContentSize: CGSizeMake(2400,8000)]; 

Voici les captures d'écran d'Interface Builder:

voir la hiérarchie

scrollview et ses sous-vues dans le constructeur de l'interface

sortie de référencement

Voici la vue en cours d'exécution, mais toute tentative de défilement horizontal ou vertical à tout moment ne fonctionne pas.

écran en cours d'exécution

Désactiver la layout automatique fonctionne, mais ce n'est pas la solution . Si vous avez vraiment besoin d'une layout automatique, utilisez-la, si vous n'en avez pas besoin, éteignez-la. Mais ce n'est pas le correctif correct pour cette solution.

UIScrollView fonctionne différemment avec les autres vues dans la layout automatique. Voici la note de publication d'Apple sur Auto Layout, j'ai copié le bit intéressant (emphase mien, au troisième point):

Voici quelques remarques concernant la prise en charge de la disposition automatique pour UIScrollView:

  • En général, la disposition automatique considère les bords supérieur, gauche, inférieur et droit d'une vue comme étant les bords visibles. C'est-à-dire que si vous épinglez une vue sur le bord gauche de sa vue d'set, vous l'attachez réellement à la valeur x minimale des limites de la vue d'set. La modification de l'origine des limites de l'aperçu ne modifie pas la position de la vue.
  • La class UIScrollView fait défiler son contenu en modifiant l'origine de ses limites. Pour que cela fonctionne avec la layout automatique, les bords supérieur, gauche, inférieur et droit dans une vue de défilement signifient désormais les bords de son affichage de contenu.
  • Les contraintes sur les sous-vues de la vue déroulante doivent aboutir à une taille à remplir, qui est ensuite interprétée comme la taille du contenu de la vue déroulante. (Cela ne doit pas être confondu avec la méthode insortingnsicContentSize utilisée pour Auto Layout.) Pour dimensionner le cadre de la vue déroulante avec Auto Layout, les contraintes doivent être explicites en ce qui concerne la largeur et la hauteur de la vue déroulante ou les bords de la vue scroll doivent être lié à des vues en dehors de son sous-tree.
  • Notez que vous pouvez faire en sorte qu'une sous-vue de la vue déroulante semble flotter (pas défiler) sur l'autre contenu défilant en créant des contraintes entre la vue et une vue en dehors de la sous-arborescence de la vue défilée, comme la vue de défilement.

Apple continue ensuite pour montrer comment utiliser correctement UIScrollView avec Auto Layout.

En règle générale, l'une des solutions les plus simples consiste à créer une contrainte entre l'élément en bas de UIScrollView. Donc dans l'élément que vous voulez voir en bas de UIScrollView, créez cette contrainte d'espace en bas:

entrez la description de l'image ici

Encore une fois, si vous ne voulez pas utiliser la layout automatique, désactivez-la. Vous pouvez ensuite définir le contentSize la manière habituelle. Mais ce que vous devez comprendre, c'est que c'est un comportement prévu de la layout automatique.

Essayez d'éteindre autolayot ​​par

Sélectionnez ViewController puis l' file inspecto et dans la section de interface builder document , vous pouvez voir Use Autolayout cochée ou non. Si elle est cochée, uncheck -la.

Cette information UIScrollView And Autolayout peut donner les détails.

Essayez ce code pour définir automatiquement la taille du contenu

Copiez et collez d'abord votre controller de vue dans la méthode viewDidLoad

  [self MHAutoContentSizeForScrollViewWithPadding:10 scrl:YOUR_SCROLLVIEW]; 

puis copyz et collez ci-dessous viewDidLoad, méthode

 -(void)MHAutoContentSizeForScrollViewWithPadding:(CGFloat)padding scrl:(UIScrollView*)view{ if ([view isKindOfClass:[UIScrollView class]]) { CGRect rect = CGRectZero; for(UIView * view in YOUR_SCROLLVIEW.subviews){ rect = CGRectUnion(rect, view.frame); } [YOUR_SCROLLVIEW setContentSize:CGSizeMake(rect.size.width, rect.size.height+padding)]; } else { NSLog(@"You can only set the ContentSize for ScrollViews"); } } 

connectez vous aussi le délégué YOUR_SCROLLVIEW et le délégué TextFeild aussi Happy Coding !!!

Si vous utilisez la layout automatique, placez tout dans UIScrollView dans un autre UIView et placez UIView comme seul enfant de UIScrollView. Ensuite, vous pouvez utiliser AutoLayout.

Si les choses près de la fin sont en désordre (la fin de la direction de votre UIScrollView défile), changez la contrainte à la fin pour avoir la priorité la plus basse possible.