web-dev-qa-db-fra.com

Comment aligner à droite une UIStackView horizontale?

Je n'ai pas encore trouvé de réponse à cela et je ne sais pas si c'est possible, mais j'essaie d'aligner à droite un UIStackView horizontal, de sorte que si les sous-vues sont masquées, elles se déplacent vers le côté droit pas la gauche. Soit par programme (dans Swift), soit en utilisant l'Interface Builder

UIStackViews s'alignent selon la direction du texte de l'utilisateur, c'est-à-dire alignés à gauche pour l'anglais et les autres langues de script romaines, ou alignés à droite pour les langues telles que l'hébreu.

À mon avis, changer cela pour des raisons de mise en page peut être une mauvaise utilisation des API de direction du texte et un peu un hack, mais avec cela à l'esprit:

Vous pouvez changer la direction d'une vue particulière dans le générateur d'interface, en utilisant le menu déroulant Sémantique, qui a des options pour 'Forcer de gauche à droite' et 'Forcer de droite à gauche', qui changeront la direction dans laquelle ils apparaissent, mais également l'ordre dans lequel ils sont affichés. Vous devrez donc inverser l'ordre des éléments dans votre vue de pile

Semantic selector in IB

Ou vous pouvez le faire en code, en utilisant le semanticContentAttribute de la vue

stackView.semanticContentAttribute = .forceRightToLeft
18
Josh Heald

J'avais un UIStackView orienté horizontalement contenant deux UIViews; masquer l'une des vues a conduit l'autre à s'étendre sur toute la largeur. L'ajout d'une contrainte de largeur à la vue restante a permis de conserver la largeur souhaitée, mais elle s'est déplacée vers la droite.

TL; DR

Ajoutez un UIView masqué à la vue de la pile qui indique quand l'autre est masqué pour l'espacement.

3
Tom Howard

Ce qui a le mieux fonctionné pour moi, c'était de placer ma vue horizontale de la pile à l'intérieur d'une vue verticale de la pile et de régler l'alignement de la verticale sur le premier plan.

3
Rachel Harvey

Contrairement aux autres réponses, la solution est en fait assez simple. Ce dont vous avez besoin est d'ajouter une contrainte de fin qui épingle la vue de pile au bord de fin de sa vue d'ensemble, puis également d'ajouter une contrainte de début qui l'épingle au bord d'attaque de la vue d'ensemble.

L'astuce, cependant, consiste à faire passer la relation de contrainte de vue de pile principale de égal à supérieur ou égal.

Cela permettra au bord d'attaque de la vue de pile de s'aligner sur la largeur intrinsèque du contenu de la vue de pile, épinglant efficacement tout sur le bord de fin.

Les vues de pile verticales sont similaires. Épinglez le haut avec égal et épinglez le bas avec inférieur ou égal.

Donc:

stackView.leadingAnchor.constraint(greaterThanOrEqualTo: parent.leadingAnchor).isActive = true

stackView.trailingAnchor.constraint(equalTo: parent.trailingAnchor).isActive = true

stackView.distribution = .equalSpacing
1
Michael Long