2012-12-19 2 views
5

Можно создать дубликат:
UIViewController returns invalid frame?Различные макеты подвид в viewDidLoad и viewWillAppear

При отладке я заметил, что в viewDidLoad называют мой взгляд кадр является origin=(x=0, y=20) size=(width=320, height=460), который не является точным. В viewWillAppear звонок правильно настроен: origin=(x=0, y=0) size=(width=320, height=416) с учетом высоты навигационной панели. Мое расположение подзаголовков зависит от корневого представления, но я не хочу их настраивать каждый раз, когда появится представление.

Как мы должны справляться с этими двумя вызовами?

+0

Сделка с ними точно так же, как и вы. Сделайте настройку просмотра в -viewWillAppear, потому что это тот, который учитывает высоту навигационной панели, а затем выполняет инициализацию в -viewDidLoad. – CodaFi

ответ

6

Правильное место для работы с макетом вида находится в методе UIViewController viewWillLayoutSubviews. Это вызывается всякий раз, когда вид контроллера просмотра имеет размер, например, при первом показании и при повороте.

Как вы видели, вид контроллера контроллера еще не был полностью установлен, когда вызывается viewDidLoad.

Если вам нужно поддерживать iOS 4.3, вы не можете использовать viewWillLayoutSubviews, так как он был добавлен в 5.0. В этом случае сделайте макет в viewWillAppear:.

+0

Следует отметить, что -viewWillAppear МОЖЕТ быть вызван до того, как будет установлен кадр представления, и окно закончит ориентироваться. Если вам это нужно, в iOS 4 вам нужно подождать, пока будет вызван -viewDidAppear. –