Ответ 1
В представленииDidLoad не гарантируется, что кадр будет отображаться так же, как и при просмотре представления. UIKit настраивает кадр представления вашего контроллера представления перед его отображением на основе контекста, в котором будет отображаться. Размер определяется на основе ориентации интерфейса и размеров любой видимой панели навигации, панели вкладок, панели инструментов или строки состояния (которая сама имеет высоту, которая может меняться, например, когда вы находитесь на телефонном звонке).
Это помогает понять, что происходит при просмотре и отображении вида контроллера просмотра:
-
В первый раз что-то позволяет получить доступ к свойству управления представлением
view
. Это может произойти в вашем собственном коде или в UIKit в ответ на действие пользователя, например, выбор вкладки. -
UIKit lazy загружает ваш просмотр контроллера вида, вызывая
loadView
, если он определен, или загружая представление из NIB, которое было указано вinitWithNibName:bundle:
. Если не существует, UIKit просто загружает пустой вид. -
UIKit вызывает
viewDidLoad
после полной загрузки представления и его подсмотров. В этот момент рамка представления будет тем, что было установлено в NIB, или вloadView
. -
Что-то требует, чтобы UIKit отображал вид контроллера вашего представления. Опять же, это может быть действие пользователя, например, нажатие на вкладке или явный вызов метода в вашем коде, например
pushViewController:animated:
илиpresentModalViewController:animated:
. -
UIKit изменяет размер представления на основе контекста, в котором он будет представлен, как описано выше.
-
UIKit вызывает
viewWillAppear:
. Теперь кадр должен быть размером, который будет отображаться. (?) EDIT: Это может быть больше недействительным. См. Комментарии ниже. -
UIKit отображает представление с анимацией или без нее.
-
UIKit вызывает
viewDidAppear:
.
Как вы можете видеть, если вам нужно знать размер вашего кадра представления перед его представлением, viewWillAppear:
- это ваша единственная возможность. Просто помните, что этот размер может измениться после появления представления по различным причинам, включая события поворота или изменения высоты строки состояния. По этой причине важно предоставить каждому подзапрос подходящую маску autoresizingMask, чтобы гарантировать правильность настройки макета для любого изменения в границах.
Если вы хотите создать свою иерархию представлений вручную, рекомендуемое место для этого - в loadView. Поскольку вы сами создаете представление в этом методе, вы можете инициализировать его фрейм, как хотите. Размер, который вы выбираете, не имеет большого значения, так как UIKit, скорее всего, изменит его на вас. Просто убедитесь, что вы правильно настроили свои объекты.