safeAreaInsets возвращает неверные значения в viewDidLoad, где их лучше всего взять?

Когда я пытаюсь получить safeAreaInsets в viewDidLoad в моем контроллере представления, он возвращает (0, 0, 0, 0) на iPhone X, что, как я знаю, неверно. В документации сказано, что это произойдет, если представление не является частью иерархии или представление не видно. Итак, мой вопрос: где лучше всего получить safeAreaInsets, а затем разместить мои подпредставления, используя эти вставки?


person Saoud Rizwan    schedule 19.09.2017    source источник
comment
Вы используете автоматическую верстку или делаете верстку вручную в коде?   -  person nathangitter    schedule 19.09.2017
comment
@nathan В этом случае я делаю макет вручную с фреймами   -  person Saoud Rizwan    schedule 19.09.2017


Ответы (1)


Вам нужно использовать viewDidLayoutSubviews вместо viewDidLoad.

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    // your layout code here
}

Примечание. В отличие от viewDidLoad, которая вызывается только один раз, viewDidLayoutSubviews часто вызывается несколько раз. Убедитесь, что фреймы установлены только внутри viewDidLayoutSubviews, и не выполняйте операции, которые должны выполняться только один раз, например, добавление подпредставлений.

person nathangitter    schedule 19.09.2017
comment
Это хорошая идея, но, к сожалению, в моем случае она вызывается во время ротации с неправильным safeAreaInsets, что вызывает у меня проблемы. Для большинства это, вероятно, не будет иметь значения, но просто обратите внимание на то, что кто-то еще увидит это... иногда это вызывается со странными вставками (вероятно, во время анимации). - person Oded; 24.10.2017
comment
@Oded, но вы вызываете viewWillLayoutSubviews и viewDidLayoutSubviews несколько раз во время ротации? - person Yevhen Dubinin; 10.11.2017
comment
@nathan Я думаю, ты можешь использовать viewWillLayoutSubviews вместо viewDidLayoutSubviews. - person Ehtesham Hasan; 24.11.2017
comment
@YevhenDubinin Прошло несколько недель с тех пор, как я работал над этим кодом, но я думаю, что работал. - person Oded; 27.11.2017
comment
В любом случае @Oded, решение, предложенное здесь @nathan, должно работать. Вы можете взглянуть на мой пост в блоге: Абстрагироваться от модели устройства при адаптации пользовательского интерфейса к iPhone X, где также используется viewDidLayoutSubviews. - person Yevhen Dubinin; 27.11.2017