Ответ
Основной метод — viewDidLayoutSubviews().
Почему он предпочтительнее viewWillLayoutSubviews?
- В
viewDidLayoutSubviews()гарантировано, что все вычисления Auto Layout завершены и все сабвью имеют свои окончательные (final) размеры (bounds,frame). viewWillLayoutSubviews()вызывается перед вычислением лэйаута. Размеры вью и её сабвью здесь могут быть неактуальными или промежуточными.
Пример позиционирования:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Безопасно используем окончательные размеры
let side = min(view.bounds.width, view.bounds.height) * 0.8
centeredView.frame = CGRect(
x: (view.bounds.width - side) / 2,
y: (view.bounds.height - side) / 2,
width: side,
height: side
)
}
Альтернативы для кастомных UIView:
layoutSubviews()— аналог дляUIView. Здесь также можно позиционировать сабвью, опираясь на окончательныйbounds.- Использование Auto Layout констрейнтов — наиболее декларативный и правильный способ, который не требует ручного вызова этих методов.