UIViewController изменяет размеры между viewWillAppear и viewDidAppear? - PullRequest
2 голосов
/ 06 мая 2011

У меня действительно странная ошибка в моем проекте. У меня есть UIScrollView как мой главный, большой взгляд. Внутри него у меня есть UIViewController (не UITableViewController), который имеет UITableView переменную экземпляра, а также некоторые другие UIButtons. Я установил рамку вида контроллера просмотра на CGRectMake(0, 64, 320, 388), так как у меня есть панель вкладок над ней (это пока не работает). Сначала он отлично работает и выглядит великолепно, но как только я представляю и отклоняю modalViewController (таким образом, перезагружая UIViewController, я полагаю), он перемещает представление UIViewController в верхнюю часть экрана (по умолчанию CGRectMake(0, 0, 320, 460), но поскольку я установил wantsFullScreenLayout на NO, теперь он устанавливает CGRectMake(0, 0, 320, 388).

Я отследил эту проблему где-то между viewWillAppear и viewDidAppear. Вот мои точные журналы после отклонения modalViewController:

2011-05-06 11: 08: 39,974 Кампус [1570: 207] Кадр 0,000000, 64,000000, 320,000000, 388,000000 (viewWillAppear)
2011-05-06 11: 08: 40.378 Кампус [1570: 207] Кадр: 0,000000, 0,000000, 320,000000, 388,000000 (viewDidAppear)

Как видите, рамка в viewWillAppear отлично, но не в viewDidAppear.

Я сделал следующие вещи, чтобы попытаться это исправить:
- Установите нужный кадр в loadView, viewDidLoad, viewWillAppear и viewDidAppear.
- Установите мой wantsFullScreenLayout на NO.
- Убил мои [super viewWillAppear:] и [super viewDidAppear:] звонки в переопределениях моего метода.

Что мне делать?!?!?

1 Ответ

0 голосов
/ 18 ноября 2011

Моя проблема заключалась в том, что с iOS 4 Apple поддерживала только 1 контроллер представления на окно.Однако, начиная с iOS 5, Apple добавила поддержку контроллеров контейнера и добавила методы для UIViewController, такие как addChildViewController:.Использование алгоритма контроллера вида контейнера решило мою проблему.Посетите UIViewController Class Reference для получения дополнительной информации.

РЕДАКТИРОВАТЬ: для тех из вас, кому лень искать "контроллер представления контейнера" ​​в ссылке на класс, вот суть соответствующего раздела вссылка на класс:

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

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

Ваш контроллер представления контейнера должен связать дочерний контроллер представления ссам перед добавлением корневого представления ребенка в иерархию представлений.Это позволяет iOS правильно направлять события на дочерние контроллеры представления и представления, которыми управляют эти контроллеры.Аналогично, после удаления дочернего корневого представления из иерархии представлений ему следует отключить этот дочерний контроллер представления от самого себя.Чтобы создать или разорвать эти ассоциации, ваш контейнер вызывает определенные методы, определенные базовым классом.Эти методы не предназначены для вызова клиентами вашего контейнерного класса;они должны использоваться только реализацией вашего контейнера для обеспечения ожидаемого поведения сдерживания.

...