Amis développeurs, J'ai des problèmes avec AutoLayout dans Interface Builder (Xcode 5 / iOS 7). C'est très basique et important donc je pense que tout le monde devrait savoir comment cela fonctionne correctement. Si c'est un bug dans Xcode, c'est un bug critique !
Ainsi, chaque fois que j'ai une hiérarchie de vues comme celle-ci, je rencontre des problèmes :
>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)
L'UIScrollView a des contraintes solides, par exemple 50 px de chaque côté (pas de problème). Ensuite, j'ajoute une contrainte d'espace supérieur à l'UILabel (aucun problème) (et je peux même épingler la hauteur/largeur de l'étiquette, ce qui ne change rien, mais ne devrait pas être nécessaire en raison de la taille intrinsèque de l'étiquette).
Le problème commence lorsque j'ajoute une contrainte de fin à l'UILabel :
Par exemple, Trailing Space to : Superview est égal à : 25
Maintenant, deux avertissements apparaissent - et je ne comprends pas pourquoi :
A) Ambiguïté de la taille du contenu défilant (la vue défilante présente une hauteur/largeur ambiguë du contenu défilant)
B) Vues déplacées (étiquette) Attendu : x= -67 Réel : x= 207
J'ai fait cet exemple minimal dans un tout nouveau projet que vous pouvez télécharger et dont j'ai joint une capture d'écran. Comme vous pouvez le voir, Interface Builder s'attend à ce que l'étiquette se trouve à l'extérieur des limites de l'UIScrollView (le rectangle en pointillés orange). La mise à jour du cadre de l'étiquette à l'aide de l'outil Resolve Issues la déplace à cet endroit.
Remarque : si vous remplacez UIScrollView par un UIView, le comportement est conforme aux attentes (le cadre de l'étiquette est correct et conforme à la contrainte). Il semble donc qu'il y ait un problème avec UIScrollView ou que quelque chose d'important m'échappe.
Lorsque j'exécute l'application sans mettre à jour le cadre de l'étiquette, comme le suggère IB, l'étiquette est bien positionnée, exactement là où elle est censée être et l'UIScrollView peut défiler. Si je mets à jour le cadre, l'étiquette est hors de vue et l'UIScrollView ne défile pas.
Aidez-moi Obi-Wan Kenobi ! Pourquoi cette disposition ambiguë ? Pourquoi cette vue déplacée ?
Vous pouvez télécharger l'exemple de projet ici et essayer de comprendre ce qui se passe : https://github.com/Wirsing84/AutoLayoutProblem
9 votes
Essayez de placer l'UILabel dans une vue de contenu, puis de définir le bord arrière de l'étiquette sur la vue de contenu (UIView normale). Cette vidéo peut vous aider grandement : youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be
1 votes
Superbe vidéo, mais les avertissements n'ont pas été corrigés pour moi.
0 votes
Merci beaucoup pour la vidéo - j'ai appris beaucoup de choses (de façon assez surprenante) ! Cependant, lorsque j'associe les connaissances de la vidéo à celles de l'ordinateur, j'ai l'impression de ne pas être à la hauteur. stackoverflow.com/questions/18953617/ Je peux corriger les avertissements. La question qui reste est la suivante : Comment faire en sorte que la taille de la ContentView du scrollView ne soit pas plus grande que nécessaire ?
0 votes
Jetez un coup d'œil à ce vidéo. Elle montre comment utiliser UIScrollLayout et autolayout avec XCode 5 / iOS 7 .
0 votes
Je vous conseille de ne pas utiliser
UIScrollView
directement. Utilisez plutôtUICollectionView
oUITableView
autant que possible, presque tout est possible avec ces éléments et cela donne aussi de la simplicité, de la lisibilité et de la réutilisabilité !!!0 votes
En plus de l'espace supérieur et de l'espace inférieur, ajoutez l'espace supérieur et l'espace inférieur.
0 votes
J'ai simplement défini Ambiguïté->Ne jamais vérifier dans l'inspecteur de taille et cela fonctionne sans ajouter UIView comme sous-vue (ce qui a cassé certaines choses pour moi, en fait). Je fais généralement le reste dans le code. Je n'ai rencontré aucun problème avec cela jusqu'à présent.
0 votes
À tout moment, le moteur de mise en page doit être capable de calculer le nombre d'heures de travail. taille du contenu (pas du cadre) de la scrollView. Par conséquent, c'est la seule vue qui nécessite 6 contraintes et non 4. Pour toute autre vue, avoir plus de 4 contraintes requises causera un conflit. Mais là encore, pas pour les scrollviews.
0 votes
Assurez-vous d'avoir lu (et compris) Apple TN2154 : "UIScrollView And Autolayout", qui explique les étapes requises.
0 votes
Voir cette autre réponse : stackoverflow.com/a/69458943/5175709 .