Как правильно выровнять горизонтальный UIStackView?

Мне еще нигде не удалось найти ответ на этот вопрос, и я не уверен, что это возможно, но я пытаюсь выровнять по правому краю горизонтальный UIStackView, чтобы, если подпредставления были скрыты, они двигались к правой стороне, а не к левой. Либо программно (в Swift), либо с помощью Interface Builder


person Programmer Unextraordinair    schedule 25.10.2016    source источник


Ответы (4)


UIStackViews выравниваются в соответствии с направлением текста пользователя, т. е. выравниваются по левому краю для английского и других языков с латинской графикой или выравниваются по правому краю для таких языков, как иврит.

На мой взгляд, изменение этого по причинам макета может быть неправильным использованием API-интерфейсов направления текста и немного взлома, но с учетом этого:

Вы можете изменить направление для определенного представления в построителе интерфейса, используя раскрывающийся список «Семантика», в котором есть параметры «Принудительно слева направо» и «Принудительно справа налево», которые изменят направление, в котором они появляются, но также порядок, в котором они отображаются. Таким образом, вам придется изменить порядок элементов в вашем стеке

Семантический селектор в ИБ

Или вы можете сделать это в коде, используя представление semanticContentAttribute

stackView.semanticContentAttribute = .forceRightToLeft
person Josh Heald    schedule 25.10.2016
comment
Есть ли способ изменить это направление для определенного UIView? - person Programmer Unextraordinair; 25.10.2016
comment
Я обновил свой ответ, чтобы рассказать, как вы меняете его для определенного представления вчера, это помогло вам? - person Josh Heald; 26.10.2016

Лучше всего для меня работало то, что я поместил горизонтальное представление стека внутри вертикального представления стека и установил вертикальное выравнивание на ведущее

person Rachel Harvey    schedule 27.06.2018
comment
Я думаю, вы имели в виду «следующий», а не ведущий. Во всяком случае, это работает. - person Salavat Khanov; 23.09.2019

В отличие от других ответов, решение на самом деле довольно простое. Что вам нужно, так это добавить конечное ограничение, которое прикрепляет представление стека к заднему краю его суперпредставления, а затем также добавить ведущее ограничение, которое прикрепляет его к переднему краю суперпредставления.

Хитрость, однако, заключается в изменении ведущего отношения ограничения представления стека с равно на больше или равно.

Это позволит переднему краю представления стека привязаться к внутренней ширине содержимого представления стека, эффективно прикрепив все к заднему краю.

Представления вертикального стека аналогичны. Закрепите верхнюю часть равными, а нижнюю закрепите меньшим или равным.

So:

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

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

stackView.distribution = .equalSpacing
person Michael Long    schedule 03.03.2019
comment
Молодцы, что предложили решение, которое на самом деле использует вещи, немного выходящие за рамки хаков по умолчанию... Вот для чего нужны эти опции - такие вещи. - person Byron Coetsee; 02.04.2020
comment
Спас меня после нескольких часов борьбы с этой проблемой! - person Juan Giorello; 29.09.2020

У меня был горизонтально ориентированный UIStackView, содержащий два UIView; скрытие одного из представлений привело к тому, что другое расширилось на всю ширину. Добавление ограничения ширины к оставшемуся виду привело к сохранению желаемой ширины, но сместилось вправо.

TL;DR

Добавьте скрытый UIView в представление стека, которое показывает, когда другой скрыт для интервала.

person Tom Howard    schedule 15.03.2018
comment
Это решает мою проблему, при таком подходе ваш вид стека должен быть настроен следующим образом: stackView.distribution = UIStackViewDistributionFill; и stackView.alignment = UIStackViewAlignmentCenter; - person Kampai; 11.06.2018