1
votes

J'ai un problème pour comprendre la logique du fonctionnement de la mise en page automatique

Voici mon référentiel du projet:

https://github.com/alonsd/MoviesApi

La raison pour laquelle je donne ici l'ensemble du projet est que les problèmes se trouvent dans un fichier .xib et ne sont pas un problème de code, c'est pourquoi je pense que ce serait la meilleure façon d'obtenir de l'aide pour ce problème.

Je suis confronté au problème suivant en essayant de remplir une cellule personnalisée dans une vue de tableau à partir de certaines données dont je dispose.

Impossible de satisfaire simultanément les contraintes. Il est probable qu'au moins une des contraintes de la liste suivante est celle que vous ne voulez pas.

J'ai donc cherché des solutions sur ce site et suis tombé sur un bon moyen de débogage pour comprendre ce qui ne va pas, j'ai créé une extension qui remplace la description var de NSLayoutDescription et affiche l'identifiant et la constante pour une compréhension plus rapide et meilleure où le problème réside. Donc, apparemment, l'erreur disparaît une fois que j'ai supprimé la hauteur et le poids de mon image dans mon fichier .xib, mais cela ferait disparaître complètement l'image du fichier .xib. Quel est le problème spécifique avec la façon dont j'ai fait ma mise en page? J'ai également essayé d'utiliser "réinitialiser les contraintes suggérées" sur mon fichier .xib et cela fait disparaître l'erreur, mais cela rend également la hauteur de chaque cellule énorme une fois que je fais défiler vers le haut et vers le bas.

Et pour un autre problème auquel je suis confronté - je pense que je ne suis pas sûr du fonctionnement des contraintes. C'est parce que lorsque vous regardez mon fichier xib, vous pouvez voir un espace majeur entre l'image et l'extrémité droite de la cellule, mais dans la liste elle-même, il n'y a rien, donc je suis vraiment confus à ce sujet.

Voici l'image du simulateur avec la tableview -

https://imgur.com/q0RWYAd

et voici l'image de mon fichier .xib avec les espaces qui n'apparaissent pas dans le simulateur -

https://imgur.com/r3vnAe6

(Je ne savais pas comment les mettre directement dans le post)


5 commentaires

vous définissez mal vos contraintes et stackview a également besoin de certaines contraintes


Quelle contrainte est la mauvaise? et quelle vue de pile est la seule contrainte manquante?


Vous avez également défini une mauvaise contrainte dans votre vue détaillée


pourriez-vous être un peu plus précis sur ce qui ne va pas?


Essayez la réponse @Sh_Khan, cela résoudra votre problème


3 Réponses :


1
votes

En général, vous devriez avoir 4 contraintes. J'ai eu le même problème avec vous pendant un certain temps et pour moi, la meilleure solution qui fonctionne le mieux est d'utiliser le pourcentage pour la hauteur ou la largeur, puis le rapport hauteur / largeur. Par exemple, la hauteur de l'élément sera de 20% de la vue, puis j'utilise le rapport hauteur / largeur pour la largeur, etc. N'utilisez pas non plus stackView pour les 5 éléments. Laissez l'image du film en dehors de la stackView.


2 commentaires

quand vous dites 4 contraintes, vous voulez dire que chaque vue doit avoir 4 contraintes concernant la pile dans laquelle elles se trouvent? ou la quantité totale de contraintes pour chaque fichier storyboard / xib doit être de 4 contraintes? aucun d'eux ne me semble logique mais j'espère que vous pourrez clarifier.


Vous devez avoir des contraintes pour la hauteur, la largeur, la position x et la position y pour chaque élément.



1
votes

1- Supprimez les contraintes de largeur et de hauteur ici

 entrez la description de l'image ici

2- Supprimer la contrainte de tête containerView ici

 entrez la description de l'image ici 3- Ajouter une contrainte de fin à la vue de la pile

4- Ajouter une valeur à la constante principale de stackview

 entrez la description de l'image ici

5- sélectionnez tous les libellés et ajustez le contenu vertical à 1000

 entrez la description de l'image ici

6- sélectionnez la pile textContainer et définissez l'espacement pour dire 20


5 commentaires

Cela ne fonctionne pas, car cela augmentera la hauteur de la cellule lors du défilement.


mondi est correct, cette solution crée 2 problèmes - 1 - la hauteur de la cellule est augmentée lors du défilement 2 - j'obtiens une petite marge entre l'extrémité de l'image et l'extrémité droite de la cellule


J'ai suivi votre solution jusqu'au numéro 6 et voici ce que j'ai obtenu jusqu'à présent: imgur.com/Mb00evN


cela fonctionne sans que la cellule ne devienne soudainement plus haute lors du défilement et sans erreur dans la console, mais elle semble vraiment "écrasée", donc je préférerais qu'elle soit un peu plus haute. aussi les marges à droite de l'image doivent être prises en compte. J'apprécierais beaucoup si vous pouviez expliquer quelles ont été mes erreurs et ce que vous avez fait jusqu'à présent. Merci!


si vous pouviez m'aider à résoudre ce problème, ce serait génial



1
votes

Le problème était que vous utilisiez StackView mais que stackveiws avait également besoin de certaines contraintes.  entrez la description de l'image ici

 entrez la description de l'image ici

Voici les contraintes que j'ai utilisées pour obtenir le résultat Je mets 4 éléments dans la vue empilée et donne une image à la largeur et à la hauteur du haut du début


5 commentaires

Oui, monsieur, mais l'OP a dit que cela augmenterait la hauteur de la cellule, mais cette solution n'augmentera pas la hauteur


il devrait augmenter la hauteur de la cellule si nécessaire


Cela n'augmentera pas la hauteur de la cellule, je pense, car j'ai déjà défini la hauteur des étiquettes et de l'image


cette solution semble un peu exagérée pour mes besoins, je vais vous mettre à jour pour ce que j'ai fait jusqu'à présent - j'ai effacé toutes les contraintes et seulement ajouté 4 contraintes au conteneur principal et je suis toujours bloqué pour comprendre ce qui cause le problème de la hauteur de la cellule. beaucoup plus grand - la seule solution à cela est de lui donner une hauteur fixe, mais j'obtiens l'erreur de ne pas pouvoir satisfaire les contraintes de la console.


J'ai déjà trouvé comment résoudre ce problème mais merci beaucoup