2015-05-12 2 views
0

В моем приложении у меня встроенный контроллер детского представления, в который во время выполнения я должен добавить один или несколько «Редактор UIView» на основе данных, поступающих с сервера. Я мог бы моделировать каждый «Редактор» как полный UIViewController в файле xib и добавлять его во время выполнения. Родитель «Редактора» имеет некоторые собственные элементы (например, заголовки и несколько кнопок), поэтому я попытался построить многоуровневый подход, используя один дочерний UIViewController и загрузив «Редакторы» в свой UIScrollview на лету. Однако я не могу заставить Autolayout сотрудничать. На этой диаграмме показана основная компоновка. enter image description hereПроблемы с Autolayout и UIScrollview и Child View

Проблемы начинаются с того, что у вас есть «Content View», встроенный в UIScrollview. Я могу заставить просмотр содержимого работать нормально с scrollview. Когда я добавляю представление редактора и добавляю ограничения времени выполнения к представлению содержимого, я получаю несколько жалоб на автомат размещения, а размер содержимого прокрутки - 0,0, поэтому я явно не получаю то, что мне нужно.

Любые идеи о том, как подойти к этому? Я всегда мог просто дублировать дополнительные элементы дочернего контроллера для каждого редактора, но было бы неплохо иметь эту работу в этом многоуровневом стиле.

Примечание. Я сделал это сначала с помощью UITableViewController, где каждый редактор является UITableViewCell, и этот автоматический макет понравился, но я хотел посмотреть, могу ли я сделать это без таблицы. Возможно, я вернусь к этому.

Добавлен это во время выполнения:

_editor = [self editorForDataType]; 
[_contentView addSubview:_editor]; 

NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:_editor 
                    attribute:NSLayoutAttributeLeading 
                    relatedBy:0 
                    toItem:self.contentView 
                    attribute:NSLayoutAttributeLeft 
                   multiplier:1.0 
                    constant:0]; 
[self.contentView addConstraint:leftConstraint]; 

NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:_editor 
                    attribute:NSLayoutAttributeTrailing 
                    relatedBy:0 
                     toItem:self.contentView 
                    attribute:NSLayoutAttributeRight 
                    multiplier:1.0 
                    constant:0]; 
[self.contentView addConstraint:rightConstraint]; 

NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:_editor 
                    attribute:NSLayoutAttributeLeading 
                    relatedBy:0 
                    toItem:self.contentView 
                    attribute:NSLayoutAttributeTop 
                   multiplier:1.0 
                    constant:0]; 
[self.contentView addConstraint:topConstraint]; 

NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:_editor 
                    attribute:NSLayoutAttributeTrailing 
                    relatedBy:0 
                     toItem:self.contentView 
                    attribute:NSLayoutAttributeBottom 
                    multiplier:1.0 
                    constant:0]; 
[self.contentView addConstraint:bottomConstraint]; 
+0

вы установите translatesAutoresizingMaskIntoConstraints на NO для взглядов _editor ли? – rdelmar

+0

Да, хотя по умолчанию он по-видимому НЕ. – ahwulf

+0

В каком методе вы добавили ограничения? 'ViewDidLoad'? –

ответ

0

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

+0

Я переместил ограничения на 'viewDidLayoutSubviews' и последовал вашему предложению. Теперь contenview обнимает представление редактора, и он сосредоточен в scrollview, который был неожиданным. По крайней мере, это немного ближе. – ahwulf

1

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

В viewDidLoad Я установил свойство height в высоту представления редактора. Теперь он отлично работает.

enter image description here

Смежные вопросы