Неожиданное поведение при автоматическом изменении размера подпредставлений, загруженных из перьев - PullRequest
4 голосов
/ 29 марта 2012

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

Для этого я начал делать очень большое представление (mainView) это подпредставление UIScrollView, однако оно становилось слишком большим, поэтому я решил создать один файл пера для каждого раздела.Я устанавливаю владельца файла каждого файла пера на MainFormViewController, а затем создаю выход для каждого вида: section1View, section2View и т. Д. Я загружаю сечения в -viewDidLoad следующим образом:

// Section 1
UINib *nib1  = [UINib nibWithNibName:@"Section1" bundle:nil];
[nib1 instantiateWithOwner:self options:nil];
CGRect frame1 = self.section1View.frame;
frame1.origin.y = 10;
[self.section1View setFrame:frame1];
[self.mainView addSubview:self.section1View]; // mainView is the one I add to the scrollView

// Section 2 (goes 10px below section 1)
UINib *nib2  = [UINib nibWithNibName:@"Section2" bundle:nil];
[nib2 instantiateWithOwner:self options:nil];
CGRect frame2 = self.section2View.frame;
frame2.origin.y = frame1.origin.y + frame1.size.height + 10;
[self.section2View setFrame:frame2];
[self.mainView addSubview:self.section2View];

// Same approach for all other sections
// ...

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

CGRect mainFrame = self.mainView.frame;
CGRect section1Frame = self.section1View.frame;
section1Frame.size.height -= 150;
mainFrame.size.height -= 150;
[UIView animateWithDuration:0.3 animations:^(){
    self.section1View.frame = section1Frame;
    self.mainView.frame = mainFrame;
    self.scrollView.contentSize = mainFrame.size;
} completion:^(BOOL finished){
    //
}];

Остальные виды (section2View, section3View и т. Д.) не"следуют" за изменениями в кадреmainView, какую бы ориентацию я ни пытался.Насколько я понимаю, изменение фрейма mainView должно влиять на фрейм его подпредставлений, в соответствии с параметрами автоматического изменения размера подпредставлений, верно?В моем случае подпредставления просто остаются в том же месте.
Выбрана опция «Авторазмер подпредставлений» основного вида в Интерфейсном Разработчике.

Кто-нибудь может мне помочь с этим?

Ответы [ 3 ]

5 голосов
/ 04 апреля 2012

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

Если ваш section2View имеет фиксированное верхнее поле, даже если размер суперпредставления изменяется, он не будет двигаться.Если его верхнее поле является гибким, а нижнее поле гибким, он будет двигаться, но только на 75 пикселей.Если только верхнее поле является гибким, оно будет правильно перемещаться вверх, но это будет работать только при изменении раздела 1.

Сводка: Вы должны вручную фиксировать положение всех своих разделов, когдаизменяя размер одного из них.Если вы поместите разделы в NSArray, это станет действительно просто.

Или лучше - используйте UITableView, который идеально подходит для этой ситуации.

3 голосов
/ 04 апреля 2012

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

С учетом сказанного я собрал пример проекта для проверки этого.Я не знаю точно, на что вы хотите повлиять, но я поместил образец на github, чтобы вы могли посмотреть, поможет ли он решить вашу проблему.

https://github.com/jdecarlo/StackOverflow9920412

Если образец не поможет вам решить вашу проблему, добавьте комментарий к этому ответу, объясняющий, почему, и я изменю его.

1 голос
/ 03 апреля 2012

Вы уверены, что маски авторазмера установлены правильно?Чтобы проверить это, используйте точку останова где-нибудь после , когда все виды и подпредставления созданы, и введите эту команду в окне GDB:

po [[self mainView] recursiveDescription]

, она покажет вам всю иерархию видов и подпредставленийсо всеми кадрами и масками авторазмера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...