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