Автоматическая компоновка XIB, встроенная в программный UIView, не зависит от родительского

У меня есть xib файл, представляющий простой вид с авто-макетом, который я создаю с помощью [[NSBundle mainBundle] loadNibNamed:@"name"][0] и добавляю к программно созданному UIView через addSubview:.

Проблема заключается в том, что представление не растягивается, чтобы соответствовать размеру представления, в которое он встроен; скорее, он по умолчанию не соответствует размеру, указанному в файле xib. (Я также не могу найти способ установить ограничения на представление контейнера в файле xib, только его подпункты.)

Также несколько странно, когда я поворачиваю iPad, ширина представления уменьшается пропорционально. Таким образом, он явно подключен каким-то образом, но с неправильными начальными значениями.

Какую связь мне не хватает, чтобы правильно вставить это встроенное представление в правильную иерархию представлений?

Скриншоты (пурпурная раскраска добавлена ​​для отладки):

screenshot 1

После поворота на портрет:

screenshot 2

Ответ 1

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

Скорее всего, IB установил представление, чтобы перевести его маску авторезистировки на ограничения. Какую маску авторезистирования трудно определить из NIB, когда она настроена на использование автоматического макета.

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

Когда вы используете автоматический макет, вы должны сделать следующее:

  • Отключить translatesAutoresizingMaskIntoConstraints в NIB или отключить его в коде, который добавит его в супервизор. Какой из этих подходов вы используете, зависит от того, будете ли вы ожидать, что представление будет когда-либо добавлено в качестве подчиненного класса представления структуры, который управляет макетом своих подзонов. Если возможно, вы должны оставить его в NIB и позволить этому классу решить, отключать ли его.

  • После добавления представления в его супервизор добавьте ограничения на супервизор, который контролирует, где должно быть выложено представление.