Распределение UIStackView с внутренним размером содержимого с приоритетом одного подпредставления

  stackView
+------------+                +
|  topView   | height: 50     |
+------------+                |
|            |                |
|            |                | total height: 300
| bottomView | height: 250    |
|            |                |
|            |                |
+------------+                +

Я хотел бы разместить два представления (topView и bottomView) в UIStackView (stackView) с этими условиями:

  • stackView имеет высоту (допустим, 300)
  • Внутренняя высота содержания topView и bottomView одинакова (допустим, 50).
  • topView должен отображаться с его внутренней высотой содержимого (до высоты stackView) (то есть 50)
  • bottomView должен занять оставшееся место (так 250)
  • если внутренняя высота содержания topView изменяется (скажем, до 100), распределение должно быть 100/200

Ни один из режимов распространения UIStackView не может покрыть это.

Установка ограничения с помощью константы здесь не поможет, поскольку внутренняя высота содержимого topView может измениться.

Поэтому мне нужны некоторые функции Auto Layout. Я пробовал устанавливать разные приоритеты сопротивления сжатию контента и приоритеты объятия контента. Без успеха я все еще чувствую, что они могут быть решением (если бы я знал, как их правильно использовать).

Это не кажется сложной проблемой, я не могу найти подходящий API Auto Layout для этого. Есть подсказки?


person MichaelGillen    schedule 01.04.2021    source источник


Ответы (1)


Вы должны установить:

  • приоритет вертикального объятия контента: вид сверху должен быть больше, чем вид снизу
  • выравнивание вида стека для заполнения
  • распределение представления стека для заполнения

Вы также должны добавить ограничение ширины, если верхний и нижний виды не имеют собственной ширины.

Демо:

введите описание изображения здесь  введите описание изображения здесь

person Sweeper    schedule 01.04.2021
comment
Спасибо! Но мой stackView имеет переменную высоту. Нет возможности сделать это с переменной высотой просмотра стека? - person MichaelGillen; 01.04.2021
comment
Сам он содержится в контейнере переменной высоты (размер которого может изменять пользователь). - person MichaelGillen; 01.04.2021
comment
@MichaelGillen Ну, является ли высота динамической или постоянной, не имеет значения в контексте этого вопроса, если это не двусмысленно. Выделенная жирным шрифтом часть - это ключ. - person Sweeper; 01.04.2021
comment
Если размер контейнера можно изменять произвольно, вы, вероятно, захотите решить, что произойдет, когда ширина / высота представления стека недостаточна для размещения его содержимого. Затем установите приоритет сопротивления сжатию контента для двух представлений соответственно, но это уже другой вопрос. - person Sweeper; 01.04.2021
comment
@MichaelGillen Так сработала ли установка приоритета объятия контента? - person Sweeper; 01.04.2021
comment
Не работал приоритет объятия контента. Думаю, что в моем макете есть что-то, что мешает этому работать. Придется разобраться позже. - person MichaelGillen; 01.04.2021
comment
@MichaelGillen Понятно. Попробуйте создать минимально воспроизводимый пример. - person Sweeper; 01.04.2021
comment
Спасибо. Я приму ваш ответ, так как предполагаю, что проблема где-то на моей стороне;) - person MichaelGillen; 01.04.2021
comment
@MichaelGillen - этот ответ - то, что вам нужно. Если вы не получаете тот же результат, вам может быть полезно использовать 2 настраиваемые метки, которые позволяют указать внутреннюю высоту. Попробуйте это с помощью этого класса: gist.github.com/DonMag/b0d839f5a4cffe4909a575414 иметь возможность установить свойство h для определенной внутренней высоты, а метка установит для своего текста значение IH: nnn - внутренняя высота - и AH: nnn - фактическая высота. - person DonMag; 01.04.2021