Как увеличить высоту представления в зависимости от содержимого его дочерних представлений

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

Как я могу добиться этого в раскадровке, не изменяя ее программно.


person Ranjith kumar    schedule 19.10.2017    source источник


Ответы (2)


Вы можете сделать это с помощью AutoLayout.

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

Обратите внимание, что в зависимости от дочерних представлений вы также можете изменить приоритеты вертикального охвата контента и сопротивления сжатию. Например, UILabel с numberOfLines, установленным в 0, может автоматически увеличиваться в зависимости от его содержимого, поэтому вы хотите, чтобы он обнимал свое содержимое по вертикали и сопротивлялся вертикальному сжатию, чтобы изменять размер родительского представления.

На этом изображении показан родительский (белый) вид с приоритетами вертикального облегания и сопротивления сжатию, установленными на панели инспектора. Обратите внимание, что для родительского представления установлены ограничения по ширине, положению x и положению y, но не по высоте. Он может определить свою высоту на основе высоты и положения дочерних представлений (см. следующее изображение).

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

На этом изображении показаны ограничения каждого дочернего представления. Обратите внимание, что приоритеты вертикального охвата и сопротивления сжатию этих представлений не изменились. Каждое из этих представлений имеет ограничения для x-позиции и y-позиции, но вы заметите, что не все из них имеют ограничения для ширины и высоты. Представления, такие как метка и переключатель, могут автоматически определять свои ограничения по размеру на основе их содержимого. Если вы не установите ограничения вертикального положения для каждого из дочерних представлений, AutoLayout не будет знать, сколько места требуется каждому из них, поэтому он не будет знать, какой высоты должно быть родительское представление.

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

person John Wickham    schedule 19.10.2017
comment
Спасибо за объяснение. Я не мог понять, можете ли вы объяснить, как это сделать с помощью изображения или серии инструкций для сценария ниже. У меня есть представление (родительское), и оно имеет один переключатель, две метки и одну кнопку вертикально друг за другом. - person Ranjith kumar; 19.10.2017
comment
Если бы вы могли объяснить мне больше о сопротивлении и объятиях, это тоже было бы хорошо - person Ranjith kumar; 19.10.2017
comment
Привет @Ranjithkumar — я отредактировал свой ответ с образцами скриншотов и пояснениями. - person John Wickham; 19.10.2017
comment
Содержимое @JohnWickham Обнимание/сжатие не для этого. - person alegelos; 19.10.2017
comment
@alegelos у вас есть официальная документация, подтверждающая это? Когда я тестировал, макеты, в которых другие ограничения с более высоким приоритетом действуют на представление контейнера, не позволяли содержимому этого представления определять его высоту. - person John Wickham; 19.10.2017
comment
@JohnWickham - Не могли бы вы объяснить мне, что такое сжатие и объятия? Я не мог понять эту концепцию ... ваша помощь будет очень признательна - person Ranjith kumar; 20.10.2017
comment
@Ranjithkumar есть ссылка на компрессионные объятия. - person alegelos; 20.10.2017

1- Добавьте контейнер View и добавьте ограничения. Не задавайте ни высоты, ни нижнего интервала или устанавливайте их, но с меньшим приоритетом (пример 999).

2- Добавьте элементы/вещи в свой контейнер просмотра и добавьте ограничения. Обязательно добавьте все требуемые ограничения, а также добавьте нижний интервал к нижнему элементу внутри.

Это определит высоту представления контейнера.

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

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

PD: забудьте об объединении контента/сжатии и приоритете . Они удобны, но здесь бесполезны. Они просто устанавливают сопротивление, чтобы стать больше или меньше.

person alegelos    schedule 19.10.2017