Автоматическая компоновка Xcode эффективна только в viewDidAppear, и это очень проблематично

После обновления моего проекта до iOS 6 я понял, что автоматический макет эффективен только в viewDidAppear, и большая часть моего кода ожидает, что рамка представления будет доступна в viewDidLoad. Это ограничение делает действительно приятную функцию автоматического компоновки почти бесполезной для меня. Есть ли какие-либо предложения, которые помогут мне использовать автомасштабирование?

Например, иногда разработчику необходимо настроить информацию о подсмотре, основываясь на том, где автоматически выбирается макет, чтобы разместить это конкретное подвью. Окончательное местоположение subview не может быть установлено разработчиком до тех пор, пока пользователь не увидит его. Пользователь не должен видеть эти корректировки информации, но должен быть представлен окончательные результаты сразу.

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

Ответ 1

Как правило, в кадре viewDidLoad никогда не следует полагаться на рамки/рамки просмотров.

Метод viewDidLoad вызывается только после того, как представление было создано либо программно, либо через файл .nib/.xib. На данный момент представление не было настроено, оно только загружено в память.

Вы всегда должны делать свой макет представления в viewWillAppear или viewDidAppear, поскольку эти методы вызывается после того, как представление было подготовлено для презентации.

В качестве теста, если вы просто NSLog(@"frame: %@", NSStringFromCGRect(self.view.frame)); в ваших методах viewDidLoad и viewWillAppear, вы увидите, что только последний метод возвращает фактический размер представления по отношению к любым другим элементам, обернутым вокруг вашего представления (например, как UINavigationBar и UITabBar).

Ответ 2

Как сказано в комментарии @charshep, вызов view.layoutIfNeeded() в viewWillAppear может сделать трюк.

Цитата его оригинального комментария

Мне не удалось получить представление таблицы в правильной позиции прокрутки при нажатии [...], потому что макет не возникал до тех пор, пока не появится viewWillAppear. Это означало, что расчет прокрутки происходил до того, как был установлен правильный размер, поэтому результат был отключен. То, что работало для меня, вызывало layoutIfNeeded, а затем код, чтобы установить положение прокрутки в viewWillAppear.