Mauvaises contraintes d'espace de fin pour les enfants de UIScrollView

J'ai créé un nouveau View Controller, puis ajouté une vue de défilement en tant qu'enfant de la vue racine et défini sur «Leading / Top / Trailing / Bottom Space to Superview» sur 0 pour que la vue de défilement remplisse complètement son parent.

Puis j'ai ajouté un button en tant qu'enfant de la vue de défilement, avec des contraintes d'espace de 15 à "Superview" (c'est-à-dire à la vue de défilement). Je m'attendrais donc à ce que le button ait un espacement de 15 sur les bordures supérieure / gauche / droite, et que le contenu de la vue de défilement se termine au 'bas du button + 15'. Cependant, la largeur du button n'est pas correcte (testé dans Xcode 5 Interface Builder, simulateurs iOS 6/7):

Exemple

Il ne fonctionne même pas si je contraint le button avec "Equal Width to Superview"! Ne prend toujours pas toute la largeur.

Comment puis-je résoudre ceci?

J'ai trouvé une bonne solution 🙂 La raison de ce comportement est que la vue de défilement adapte sa taille de vue de contenu à ce qui est réellement nécessaire à ses sous-vues, et ne remplira pas la largeur / hauteur automatiquement. Si la largeur doit être remplie, la vue de défilement doit contenir au less une vue remplissant la largeur de l'écran.

Avec ces étapes, j'ai ajouté une vue qui a une largeur égale à la vue défilement (la vue défilement elle-même, pas sa zone d'affichage de contenu), conduisant à mon affichage déroulant finalement à la pleine largeur parce que j'avais ajouté des contraintes 0/0/0/0 "à la vue défilement.

  • En supposant un controller de vue vide avec une vue racine
  • Ajouter une vue de défilement, définir des contraintes "espace pour superview haut / gauche / droite / bas = 0/0/0/0" sur ce
  • Ajoutez votre interface user à la vue de défilement comme vous le souhaitez et définissez également les contraintes de votre choix
  • Ajoutez une nouvelle vue, renommez-la en quelque chose comme "Garantit que la vue déroulante remplit la largeur", avec les contraintes suivantes
    • Diriger / trailing / top l'espace vers superview (c'est la vue défilement!) = 0
    • Hauteur 0 car nous voulons qu'il soit invisible car la vue n'est qu'une aide
    • Partie importante: Sélectionnez cette vue et la vue déroulante dans la hiérarchie et contraignez-les à la même largeur. Étant donné que la vue de défilement est contrainte à son aperçu, il recevra une largeur. Ensuite, cette contrainte garantit que la vue de contenu de la vue déroulante est également (au less) aussi large.