UIViewController изменяет размеры между viewWillAppear и viewDidAppear?

У меня действительно странная ошибка в моем проекте. у меня есть 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 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам