Autolayout aller plus loin avec les contraintes

Bonjour à toutes et tous,

Dans les cours d’autolayout il n’est pas abordé la problématique des règles de distance “plus petit ou égal” ou “plus grand ou égal” et hélas je ne parviens pas à réaliser ce que je veux en tentant de mettre en œuvre ceci. Il y a peut être quelque chose que j’ai mal compris.

Imaginons 3 labels nommés “Haut, Centre et Bas”. Je veux centrer sur l’écran le label “Centre” : aucun problème centrage horizontal et vertical et ça marche. Pour les 2 autres labels (Haut et Bas) un centrage horizontal est obtenu sans problème. Pour la position verticale je souhaite que le bas du label Haut soit au plus à 100 du haut du label centre et là c’est la cata… Xcode m’indique “Inequality Constraint Ambiguity”. Je me dis logique il sait à combien il peut l’éloigner au max mais ne sait pas combien il doit avoir de minimum. ça tombe bien je ne veux pas que le bas du label haut soit à moins de 20 du haut du label centre et donc j’ajoute la contrainte correspondante. Mais hélas ça ne règle rien. j’ai maintenant 2 erreurs “Inequality Constraint Ambiguity”. Si j’ajoute une contrainte d’égalité (même de priorité plus faible) alors je n’ai plus d’erreur mais seule la contrainte d’égalité est appliquée. J’ai un peu tout tenté (inverser sens des objets dans les contraintes, niveau de priorité,…) mais rien n’y fait.

Quelque chose me laisse penser que ça ne fonctionne pas les contraintes d’inégalité car si je mets une seule contrainte d’inégalité (par exemple supérieure à 100). Elle n’est pas respectée si je passe en paysage sur un iphone SE. Idem avec la contrainte inférieure à en écran d’Ipad…

Quelqu’un peut il m’expliquer à quoi servent ces contraintes d’inégalité et comment obtenir un espace variable entre 2 objets avec un minimum de distance et un maximum ?

Merci d’avance pour vos explications.

NB : Tests effectués avec XCode 8.3.2 (8E2002).

Xcode ne peut pas calculer une position y avec une seule contrainte d’inégalité. C’est comme si tu disais :

  • calculer la position précise de y sachant que y est compris entre 20 et 100. C’est tout juste impossible. Le cerveau humain qui fonctionne sur un plan global a tendance à ajouter d’autres contraintes mentalement, liant l’objet à son contexte (l’écran et les autres objets graphiques) mais Storyboard est incapable de le faire. Il lui faut au moins une information précise pour calculer la position et la taille du label. Comme par exemple, une autre contrainte définissant un écart fixe de 100 points entre le label Haut et le début de l’écran.

La preuve en image :

Tu peux voir qu’il n’y a pas d’avertissement d’ambiguïté de contraintes sur l’image.

Super merci Draken.

En effet il fallait que je fixe quelques règles supplémentaires :

  • forcer la hauteur des labels (sinon ils s’étirent en hauteur sur les écrans plus grands)
  • donner une référence du label haut en position fixe par rapport à la vue parente mais en mettant une priorité plus faible que les 2 contraintes du label haut par rapport à celui du centre. Ainsi sur iphone en paysage le label haut se rapproche bien de celui du centre mais reste à 20 au dessus et ne s’éloigne pas de plus de 100 du label centre en mode portrait ou sur les grands écrans quelle que soit l’orientation. En fait la contrainte du label haut par rapport au parent avec une priorité faible joue le role d’élastique pour le tirer le plus possible vers le haut dans les limites données par rapport au label centre.

Merci encore pour l’aide apportée et l’éclairage donné. J’espère que cette question aidera d’autres personnes à mieux comprendre encore les layouts.

NB : Maxime si tu suis ce fil et que pour le prochain iOS 11 et Swift 4 tu cherches des idées, tu pourras rajouter une vidéo “Aller encore plus loin avec les layouts” au chapitre consacré aux layouts car je doute que ça diffère beaucoup entre iOS 10 et 11 sur ce point et que le nouveau cours soit à refaire sur ce chapitre des layouts.

1 « J'aime »

Salut,

Si tu veut, tu peut créer des vues bien spécifique à chaque position en ajoutant des contraint par type de taille d’écran.

En bas tu peut choisir ton type d’iPhone et juste en dessus ou il y a écrit le nom de l’iPhone, il y a entre parenthèse des lettres. Leurs signification sont celle-ci : w = width h = height C = Compact et R = Regular.

Donc, si tu clique sur ta contrainte et que tu vas sur l’onglet avec la règle tu peut ajouter un contrainte spécifique a cette position d’écran.

Et/ou utiliser des contraintes personnalisées exprimées en % de la taille réelle de l’écran :

http://community.purplegiraffe.fr/t/uitrait-et-sizeclass-pas-la-panacee-mais-a-t-on-mieux/41/3

Content que vous ayez trouvé la solution.
Je prends note des demandes pour le cours iOS 11, si je peux faire une ou 2 vidéos là dessus je le ferai :wink: