Ответ
Constraints обычно устанавливают в viewDidLoad(). Для динамических обновлений используют viewDidLayoutSubviews() или updateViewConstraints().
Рекомендации по выбору метода:
viewDidLoad()— основной метод для первоначальной настройки статических constraints. Вью загружена, но её размеры ещё не определены.viewDidLayoutSubviews()— если constraints зависят от окончательных размеров вью (например, нужно выровнять элемент относительно центра). Вызывается несколько раз (при повороте, изменении размера).updateViewConstraints()— для сложной, изменяемой логики constraints. Система вызывает его при необходимости обновить layout.
Пример установки в viewDidLoad():
override func viewDidLoad() {
super.viewDidLoad()
let redView = UIView()
redView.backgroundColor = .red
view.addSubview(redView)
redView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
redView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
redView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
redView.widthAnchor.constraint(equalToConstant: 100),
redView.heightAnchor.constraint(equalToConstant: 100)
])
}
Важно: Избегайте установки constraints в loadView(), viewWillAppear(_:) или viewDidAppear(_:), чтобы не вызывать лишние операции расчёта layout.
Ответ 18+ 🔞
А, ну это про констрейнты, да? Ну, блядь, классика жанра! Смотри, тут как с унитазом — если наебнуться с выбором места, потом весь пол зальёшь, сука.
Вот смотри, обычно их пихают в viewDidLoad(). Это как базовая расстановка мебели в новой квартире — вьюха загрузилась, но где точно будут стены, ещё нихуя не ясно. Статику, недвижимость всякую — туда.
А если тебе надо подогнать размеры уже под реальные габариты, когда вьюха уже отрисовалась и понятно, где что, то это viewDidLayoutSubviews(). Он, этот ушлёпок, вызывается по несколько раз — повернул экран, размер изменился — оп, он тут как тут. Тут уже можно ровнять по центру, относительно других элементов, которые уже заняли своё место.
Ну а updateViewConstraints() — это уже для сложных, ебучных случаев, когда логика констрейнтов меняется динамически, на ходу. Система сама его дергает, когда понимает, что пора всё пересчитать. Вмешивайся, если реально надо.
Главное, сука, запомни: Не лезь со своими констрейнтами в loadView(), viewWillAppear(_:) или viewDidAppear(_:). Это как начать переставлять диван, когда гости уже пришли — лишние телодвижения, система будет пересчитывать лэйаут без всякой на то причины, и всё начнёт тормозить и глючить. Пиздец, а не разработка.
Вот тебе пример, как обычно делают в viewDidLoad():
override func viewDidLoad() {
super.viewDidLoad()
let redView = UIView()
redView.backgroundColor = .red
view.addSubview(redView)
redView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
redView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
redView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
redView.widthAnchor.constraint(equalToConstant: 100),
redView.heightAnchor.constraint(equalToConstant: 100)
])
}
Всё, красный квадратик по центру. Просто, как три копейки. Главное — translatesAutoresizingMaskIntoConstraints = false не забудь, а то получишь ебучую ошибку, и будешь потом полдня искать, в чём дело. Ядрёна вошь!