UIViewController функция жизненного цикла loadview () кадр вопрос - PullRequest
0 голосов
/ 07 мая 2019

Я в основном работал с раскадровкой, пока недавно не перешел к созданию только контроллера с кодом.

Я следовал нашему стандарту кодирования, чтобы создать некоторое подпредставление в функции loadView(), внутри которой первая строкаsuper.loadView().

Из того, что я заметил, после того, как я позвонил super.loadView(), фрейм self.view уже установлен правильно с самим viewController, который в точности является фреймом viewController.

Мои коллеги с большим опытом говорят, что в прежние времена это на 100% не работало, что вместо этого должно было бы дать вам CGRectZero, и, вероятно, я не должен на это полагаться.

Я хочу услышать больше предложений от другихpeople.

Вот мой пример настройки проекта: 1. создать простой проект 2. добавить кнопку в первый VC 3. создать второй VC по коду, переопределить функцию loadView() во втором VC, вызвать super.loadView() там и напечатайте self.view.bounds следующую строку 4. self.present или используйте навигационный контроллер из VC1 в действии кнопки, чтобы представить или нажать VC2 5. это всегда дает мне правильную рамкуe второго ВК.

Пожалуйста, дайте мне знать.

----------- Редактировать -------------

Чтобы прояснить мой вопрос, я знаю функции жизненного цикла, такие как viewDidLayoutSubviews или layoutSubViews, чтобы вернуть правильный вид.Я НЕ спрашиваю об этом.

Мой вопрос: почему loadView() IS возвращает мне кадр ПРАВИЛЬНЫЙ .

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

К сожалению, я не могу дать никакого представления о том, что происходит под капотом - хотя я могу сказать вам, что согласно документации вам не следует звонить super.loadView():

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

(Выделение мое)

0 голосов
/ 07 мая 2019

1) Я в основном работал с раскадровкой, пока недавно не перешел к созданию только контроллера с кодом.

Я следовал нашему стандарту кодирования, чтобы создать некоторое подпредставление в функции loadView (), внутри которой, первыйстрока super.loadView ().

  • Поскольку вы используете xibs, используйте viewDidLoad вместо loadView из-за If you use Interface Builder to create your views and initialize the view controller, you must not override this method., как указано в loadView в Apple Docs.

2) Мои коллеги с большим опытом говорят, что в прежние времена это на 100% не работало, так как вместо этого он должен дать вам CGRectZero, и, вероятно, я не должен на это полагаться.

Я хочу услышать больше предложений от других людей.

  • Правильный кадр для viewController.view будет при вызове viewWillLayoutSubviews.Что касается его подпредставлений, то viewDidLayoutSubviews - это то, что вам нужно.
  • рамка просмотра внутри loadView и viewDidLoad имеют размер кадра пера.Ваши коллеги правы, что он не вернет нужный размер.Это заметно при запуске приложения для iPad с модальным представлением viewcontroller или при запуске вашего приложения на экране другого размера, в отличие от устройства в формате xib

ТАКЖЕ, этот вопрос напрямую связан с вашим вопросом: Почему мне приходится вручную устанавливать рамку моего вида в viewDidLoad?

...