Как изменить размер родительского представления на основе размера подпредставлений, созданных с помощью Autolayout

Я готовлю пользовательское представление, похожее на пример, показанный на скриншоте. Я добавляю все компоненты пользовательского интерфейса (метки, текстовые поля, переключатели и т. д.) во время выполнения. Для позиционирования элементов я использую Autolayout ограничения. Эта часть пока работает нормально.

Пользовательский вид

Количество элементов варьируется от контекста к контексту. Интересно, как я могу использовать ограничения Autolayout для динамического изменения размера родительского представления (скорее всего, высоты представления). Поэтому ограничения представления должны учитывать высоту и поля, определенные для вложенных в данный момент подпредставлений.


person JJD    schedule 24.10.2012    source источник


Ответы (2)


Я сделал это со следующей настройкой:

  • представление контейнера не имеет ограничений по высоте
  • верхнее подпредставление имеет ограничение интервала от верхней части представления контейнера
  • все содержащиеся представления имеют интервалы между ними
  • нижний вид имеет ограниченное расстояние до нижней части контейнерного вида

Система автоматической компоновки удовлетворяет этим ограничениям, изменяя размер контейнера в соответствии с его содержимым.

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

person jrturton    schedule 13.11.2012
comment
Какого события вы ждете, чтобы узнать, что менеджер компоновки выполнил свою работу, то есть увеличил или уменьшил вид контейнера? - person JJD; 14.11.2012
comment
В iOS это будет viewDidLayoutSubviews в контроллере представления, но я не уверен в эквиваленте какао. Есть ли причина, по которой вам нужно знать? - person jrturton; 14.11.2012
comment
Я использую Autolayout как часть более крупной композиции, которая сама не использует Autolayout. Поэтому мне нужно переставить части композиции, когда менеджер компоновки все-таки закончит свою работу. - person JJD; 14.11.2012
comment
Ок, больно. Я бы не хотел говорить на самом деле, я не занимался разработкой OS X уже несколько лет. - person jrturton; 14.11.2012
comment
Я хотел бы 1) поблагодарить вас за этот ответ и 2) подчеркнуть важность номеров 2 и 4. Я боролся с этим, потому что мои подвиды (UIButtons) отображались, но их нельзя было использовать. Оказывается, у супервизора не было размера (то есть 0x0), потому что отсутствовали ограничения интервала до супервизора. - person Scott Berrevoets; 30.05.2013
comment
Вы должны включить TranslatesAutoresizingMaskIntoConstraints = false в видах, размер которых нужно изменить. - person N_A; 06.09.2014
comment
@ScottBerrevoets У меня была та же проблема .. кнопку можно было увидеть, но нельзя было потрогать. Мне понадобился целый день, чтобы понять это - person MK Yung; 22.06.2015

Если вы используете NSStackView, убедитесь, что вы не установили ограничение для его высоты и ширины, и убедитесь, что все стороны закреплены.

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

Также убедитесь, что вы установили для свойства Content Hugging значение 1000.

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

person Chris    schedule 24.04.2016