UIScrollView n’utilise pas de contraintes d’autolayout

J’ai une vue de défilement et une vue d’image derrière elle et je la remplis avec des plumes. J’utilise autolayout. J’ai un espace en bas pour la vue et un espace supérieur pour la vue sur les deux vues. La vue de l’image fait exactement ce que je veux qu’elle fasse. Pour iphone 5 c’est là que je le veux. Et pour les autres iphones, il rest au-dessus du bas de l’écran, donc il se redimensionne correctement. La vue de défilement apparaît directement sur l’iPhone 5, mais sur les autres téléphones, elle ne se redimensionne pas. Elle défile donc sous 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) "", "", "", "", "" Will attempt to recover by breaking constraint  

J’ai déjà essayé

 [self setTranslatesAutoresizingMaskIntoConstraints:YES]; 

et

 [self.myScrollView setTranslatesAutoresizingMaskIntoConstraints:YES]; 

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

    La relation entre UIScrollView et la disposition 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 à 10 points du haut de la vue de défilement, elle serait absolument épinglée là; il ne bougerait jamais, peu importe la manière dont la vue de défilement était défilée.

    Pour résoudre ce problème, un UIScrollView qui utilise autolayout fonctionne de manière totalement nouvelle. Par conséquent, lorsque vous dites “j’utilise autolayout”, vous devez vous préparer à ce que les choses fonctionnent très différemment d’avant. Vous devez 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

    Très important lors de l’utilisation de la mise en page automatique: vous devez épingler la droite et / ou le bas de la dernière sous-vue à droite et / ou en 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 atsortingbute:NSLayoutAtsortingbuteRight relatedBy:NSLayoutRelationEqual toItem:scrollView atsortingbute:NSLayoutAtsortingbuteRight multiplier:1.0 constant:0]]; 

    Mes remerciements à ce site pour fournir l’exemple parfait.

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

    Pour que UIScrollviews fonctionne bien avec les contraintes, j’utilise cette approche ici . Dans cette réponse, je m’intéresse à la façon d’obtenir un défilement vertical de défilement qui fonctionne également avec la rotation de l’appareil. Vous pouvez également modifier l’approche pour travailler avec des défilements à défilement horizontal . Pour les vues de défilement qui défilent dans les deux sens, n’ajoutez pas l’astuce de contrainte de largeur correspondant à la taille. Mais faites tout le même.

    Un certain nombre de choses.

    1. assurez-vous que l’autolayout est activé (IB dans l’onglet “File Inspector”)
    2. Assurez-vous de ne pas apporter de modifications impliquant des limites, des frameworks, etc.
    3. Assurez-vous de ne pas utiliser AutoResizingMask. Cela concurrencera vos nouveaux parameters. Si cela est fait correctement, vous pouvez maintenant mettre en forme votre bouton et cela fonctionnera très bien. Voici comment.

    Cette erreur indique que votre nib ou un contrôle dans cette nib n’utilise PAS la mise en page automatique.