Почему свойство представления UIViewController не автоматически изменяет размер containerView?

Я использую контейнерВью. В containerView много странного.

Одна из странностей заключается в том, что тип представления — это просто UIView. Итак, в чем разница между этим представлением и всеми остальными подпредставлениями?

Затем я начал настраивать вещи, прочитав кучу примеров кода.

[self.ContainerView addSubview:self.listBusinessViewController.view];// initialize'

В то время self.listBusinessViewController уже является потомком самого себя. Итак, у меня 3 детей.

Что удивительно, так это то, что размер фрейма self.listBusinessViewController.view остается таким, как я установил его в xib, а не автоматически изменялся до ContainerView.

Если я сделаю это:

[self.ContainerView addSubview:self.listBusinessViewController.view];// initialize'
PO(NSStringFromCGRect(self.ContainerView.frame));
PO(NSStringFromCGRect(self.listBusinessViewController.view.frame));
PD(self.listBusinessViewController.view.autoresizingMask);
PD(UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight);

Я получил:

NSStringFromCGRect(self.ContainerView.frame): {{0, 48}, {320, 412}}
NSStringFromCGRect(self.listBusinessViewController.view.frame): {{0, 0}, {320, 480}}
self.listBusinessViewController.view.autoresizingMask: 18
UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight: 18

Итак, ContainerView имеет высоту 412. ListBusinessViewController.view имеет высоту 480. Маска автоматического изменения размера равна 18, что и ожидается. Это означает, что он имеет гибкую ширину, высоту и негибкую границу.

Так почему же высота listBusinessViewController.view не становится равной 412, как это делается в superview?

Я могу, конечно, сделать это властным способом, используя

CGRect frameOfAllChild = CGRectMake(0, 0, self.ContainerView.frame.size.width, self.ContainerView.frame.size.height);
for (UIViewController * child in self.childViewControllers) {
    child.view.frame=frameOfAllChild;

}

Код ubber alles (хотя бы ubber xib). Тем не менее, весь смысл гибкой высоты и ширины заключается в том, чтобы представление заполнило его суперпредставление или его окна.

Я что-то упускаю?


person user4951    schedule 16.10.2012    source источник
comment
self.ContainerView не компилируется. sscce.org   -  person    schedule 16.10.2012
comment
@ H2CO3 предположительно ContainerView - это имя выхода / свойства, которое указывает на представление контейнера, добавленное в xib или раскадровку.   -  person jrturton    schedule 16.10.2012
comment
Мне жаль. Да, Юртуртон прав. Я предполагаю, что здесь используется описательное имя. H2CO3, вы пытались скомпилировать код вопросов? Я впечатлен вашей самоотверженностью.   -  person user4951    schedule 16.10.2012
comment
У @H2CO3 есть компилятор в голове, но он еще не обновлен для использования ARC или xibs/раскадровок;)   -  person jrturton    schedule 16.10.2012
comment
@jim thio На самом деле я не пытался его скомпилировать, но я уверен, что он не скомпилируется, потому что соглашение об именах Cocoa (Touch) запрещает использование заглавных букв в свойствах и методах.   -  person    schedule 16.10.2012


Ответы (1)


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

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

Ваш окончательный фрагмент кода лучше написать как

child.view.frame = self.ContainerView.bounds;
person jrturton    schedule 16.10.2012
comment
Это означает, что все это время мы можем использовать дизайн containerView DesignerView, если только мы удосужимся сообщать дочерним ViewControllers, когда они появляются, исчезают и т. д. - person user4951; 16.10.2012
comment
Я думаю, что автоматическое изменение размера просто переопределяет настройку размера кадра. Не уверен, что делают PO() и PD(). Автоматическое изменение размера и установка размера кадра вручную несовместимы. РТМ - person deleted_user; 16.10.2012