77 votes

UIScrollView n'utilise pas les contraintes d'autolayout

J'ai un parchemin et un affichage de l'image derrière elle et je suis le remplissant avec les plumes. Je suis en utilisant la mise en page automatique. J'ai un espace inférieur à superview et un espace de superview sur les deux points de vue. L'affichage de l'image est exactement ce que je veux faire. Pour l'iphone 5 c'est où je veux. Et pour les autres iphones, il reste au-dessus de la partie inférieure de l'écran, de sorte qu'il redimensionne correctement. Le défilement de l'affichage ressemble à droite sur l'iphone 5, mais sur les autres téléphones, il n'est pas redimensionnée, de sorte qu'il se défile vers le bas ci-dessous le point de 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];

À partir de ce que je peux voir que cela prend juste hors de toutes les contraintes de la vue. Et ce n'est pas ce que je veux.

175voto

matt Points 60113

La relation entre UIScrollView et de mise en page automatique est différent des autres aspects de la mise en page automatique. En gros, si simple mise en page automatique ont été autorisés à opérer, rien de défilement. Par exemple, si une sous-vue de défilement de la vue ont été épinglés dans la voie normale par une contrainte de 10 points à partir du haut de défilement de la vue, il serait absolument épinglé là; il ne déplacez jamais, quel que soit le mode de défilement de la vue ont été défile.

Pour résoudre ce problème, un UIScrollView qui utilise la mise en page automatique fonctionne d'une manière complètement nouvelle. Donc quand vous dites "je suis en utilisant la mise en forme automatique" vous devez préparer pour que les choses fonctionnent très différemment d'avant. Vous devez utiliser un unique de défilement de la vue sous-vue avec translatesAutoresizingMaskIntoConstraints = YES, et un contenu explicite de la taille ou de l'autre tout doit avoir translatesAutoresizingMaskIntoConstraints = NO et la taille du contenu sera déduit implicitement basée sur les contraintes de la sous-vues.

C'est très bien expliqué dans http://developer.apple.com/library/ios/releasenotes/General/RN-iOSSDK-6_0/index.html

161voto

phatmann Points 4153

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 donner l'exemple parfait.

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

-3voto

JustLearningAgain Points 538

Un couple de choses.

  1. assurez-vous mise en page automatique est activé (IB sur le "Fichier Inspecteur Onglet")
  2. Assurez-vous que vous n'êtes PAS de faire tous les changements qui impliquent des limites, cadre, etc. - tout cela est fait par Auto contraintes maintenant
  3. Assurez-vous de rester à l'écart de AutoResizingMask. Ce sera en concurrence avec les nouveaux paramètres. Si ceux-ci sont fait à droite, vous pouvez maintenant mise en page de votre bouton et il sera parfait. Voici comment.

Cette erreur indique que votre plume ou un contrôle à l'intérieur de cette plume n'est PAS à l'aide de mise en page automatique.

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