web-dev-qa-db-fra.com

UIScrollView + Vue centrée + Taille du contenu à défilement ambigu + Plusieurs tailles d’iPhone

J'ai:

  • application, qui devrait fonctionner en mode paysage et portrait.
  • voir avec la vue de défilement pleine grandeur en haut.
  • certaines vues à l'intérieur de la vue de défilement avec une largeur et une hauteur fixes. (avec les contraintes H et W ajoutées)
  • définir pour afficher à l'intérieur de la vue de défilement comme horizontal centré dans le conteneur. (ajouté en fonction de la contrainte)

J'ai un avertissement dans le générateur d'interface "A une largeur de contenu défilable ambiguë" .enter image description here

Je sais que le seul moyen de résoudre ce problème est de définir des contraintes de fin et principales . Mais pour différents iPhones (5,5 ", 4,7", 4 "), je dois définir différentes contraintes de fin et de tête.

Comment puis-je éliminer cet avertissement tout en conservant une vue centrée horizontalement avec les valeurs W et H fixes pour toutes les tailles d’iPhone?

Je crée un repo Github pour illustrer ce problème: ScrollViewAmbigous

Ceci n'est pas une copie de UIScrollView Ambiguïté de la taille du contenu défilable , Mais similaire (et pas répondu), mais cette question concerne en particulier différentes tailles d'iPhones.

20
skywinder

Le matin, avec une tasse de café fraîche, j’ai trouvé une solution de contournement pour ce problème!

Donc, voici l'état initial pour le cas le plus simple:

  1. scrollView avec 0 contrainte sur tous les bords
  2. Bouton centré horizontalement et verticalement avec largeur et hauteur fixes
  3. Et bien sûr, Has ambiguous scrollable content width et Has ambiguous scrollable content heightavertissements gênants.

1

Tout ce que nous devons faire, c'est:

  • Ajoutez 2 contraintes supplémentaires, par exemple "0" pour l'espace de fin et/ou l'espace inférieur pour notre vue (dans mon cas, UIButton)

Important: vous devez ajouter des contraintes de fin et/ou de fond. Pas "leader et top" - ça ne marche pas!

2

Vous pouvez le vérifier dans mon exemple de projet, montrant comment résoudre ce problème: ScrollViewAmbigous

P.S.

Je ne sais pas pourquoi cela fonctionne et comment Xcode détecte quelle contrainte est la plus prioritaire (parce que je ne donne pas la priorité à ces contraintes explicitement), mais je serai reconnaissant si quelqu'un explique, pourquoi cela fonctionne dans les commentaires ci-dessous.

45
skywinder

Problème

  1. L'avertissement nous dit que la taille du contenu du Scrollview dépend de ses sous-vues. 
  2. bien que votre sous-vue n’ait pas de règle stricte de position et de taille (pas de contraintes fixes), elle confondra la taille du contenu.

Solution

  1. Créez une seule sous-vue en tant que 'contentView' pour scrollview.
  2. Ajoutez des contraintes strictes (fixes) à ce 'contentView'.

    Meilleure pratique: égaler la largeur et la hauteur de la vue de défilement.

  3. Ajoutez toutes les autres sous-vues et contraintes à votre 'contentView'.
8
Timur X.

Il semble y avoir beaucoup de confusion sur cette question. Mon point de vue est qu’UIScrollView doit avoirDEUXcontraintes de fin d’espace, une connexion «interne» le reliant à une de ses sous-vues (afin qu’il puisse connaître la largeur de son contenu) et une autre «externe» le connectant un frère ou une soeur afin qu'il connaisse la largeur de son cadre.

Le même principe s’applique pour la hauteur, c’est-à-dire deux contraintes d’espace inférieur.

0
Reuben Scratton