web-dev-qa-db-fra.com

UIScrollView n'utilise pas les contraintes d'autolayout

J'ai une vue de défilement et une image derrière et je la remplis de plumes. J'utilise autolayout. J'ai un espace inférieur pour superview et un espace supérieur pour superview sur les deux vues. La vue de l'image fait exactement ce que je veux qu'elle fasse. Pour l'iphone 5 c'est là où je le veux. Et pour les autres iphones, il reste au-dessus du bas de l'écran, il est donc redimensionné correctement. La vue de défilement apparaît bien sur l'iphone 5, mais sur les autres téléphones, elle n'est pas redimensionnée. Par conséquent, elle défile en dessous de la vue de l'application. Je reçois ces messages dans le journal:

 2012-11-21 10:42:38.576 LCHApp[12604:907] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. 
  Try this: (1) look at each constraint and try to figure out which you don't expect;
  (2) find the code that added the unwanted constraint or constraints and fix it.
 (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer
  to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

"<NSLayoutConstraint:0x1d8ea080 UIScrollView:0x1d8413b0.bottom == UIImageView:0x1d892110.bottom>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cca10 h=-&- v=-&- ScheduleViewNib:0x1d853630.height == UIScrollView:0x1d8413b0.height - 386>",
"<NSLayoutConstraint:0x1d8e5340 V:[UIImageView:0x1d892110]-(64)-|   (Names: '|':ScheduleView:0x1d8efc30 )>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cf520 h=--& v=--& V:[ScheduleView:0x1d8efc30(480)]>",
"<NSLayoutConstraint:0x1d8eaed0 V:|-(45)-[UIScrollView:0x1d8413b0]   (Names: '|':ScheduleView:0x1d8efc30 )>"


 Will attempt to recover by breaking constraint 
 <NSLayoutConstraint:0x1d8ea080 UIScrollView:0x1d8413b0.bottom ==      UIImageView:0x1d892110.bottom>

J'ai déjà essayé

[self setTranslatesAutoresizingMaskIntoConstraints:YES];

et

[self.myScrollView setTranslatesAutoresizingMaskIntoConstraints:YES];

D'après ce que je peux voir, cela supprime simplement toutes les contraintes des vues. Et ce n'est pas ce que je veux.

75
SirRupertIII

La relation entre UIScrollView et la présentation automatique est différente des autres aspects de la présentation automatique. Fondamentalement, si la mise en page automatique simple était autorisée à fonctionner, rien ne défilerait. Par exemple, si une sous-vue de la vue de défilement était épinglée de manière normale par une contrainte de 10 points à partir du haut de la vue de défilement, elle serait absolument épinglée là; il ne bougerait jamais, peu importe comment la vue de défilement était défilée.

Pour résoudre ce problème, un UIScrollView utilisant autolayout fonctionne d'une manière totalement nouvelle. Par conséquent, lorsque vous dites "J'utilise l'autolayout", vous devez vous préparer à ce que les choses fonctionnent très différemment. Vous devez soit utiliser une seule sous-vue de défilement avec translatesAutoresizingMaskIntoConstraints = YES, et une taille de contenu explicite, sinon tout doit avoir translatesAutoresizingMaskIntoConstraints = NO et la taille du contenu sera déduite implicitement en fonction des contraintes des sous-vues.

Ceci est très bien expliqué dans https://developer.Apple.com/library/content/releasenotes/General/RN-iOSSDK-6_0/index.html

173
matt

Très important lors de l'utilisation de la disposition automatique: vous devez épingler la droite et/ou le bas de la dernière sous-vue à la droite et/ou le bas de la vue de défilement. Voici comment la vue de défilement connaît la taille du contenu. Par exemple:

[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:lastSubView
                                                 attribute:NSLayoutAttributeRight
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:scrollView
                                                 attribute:NSLayoutAttributeRight
                                                multiplier:1.0
                                                  constant:0]];

Merci à ce site pour avoir fourni l’exemple parfait.

J'ai perdu des heures à cause de cela et j'espère pouvoir épargner aux autres ma douleur.

161
phatmann

Pour que UIScrollviews fonctionne correctement avec les contraintes, j’utilise cette approche avec la réponse ici . Dans cette réponse, je décris comment obtenir un verticalement scrollview scrollview fonctionnant également avec la rotation de périphérique. Vous pouvez modifier l'approche pour travailler avec horizontalement en faisant défiler les vues de défilement. Pour les vues de défilement qui défilent dans les deux sens, ne pas n'ajouter le tour de force de contrainte de taille. Mais fais tout le même pareil.

0
n8tr