Ответ
В UIKit система компоновки — это Auto Layout, декларативный механизм, основанный на ограничениях (constraints). Она динамически вычисляет размер и положение (frame) каждого UIView на основе математических отношений между его атрибутами и атрибутами других представлений или супервью.
Базовый пример: Центрирование кнопки.
let button = UIButton(type: .system)
view.addSubview(button)
button.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
// Позиция: центр кнопки совпадает с центром родительского view
button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
button.centerYAnchor.constraint(equalTo: view.centerYAnchor),
// Размер: фиксированные ширина и высота
button.widthAnchor.constraint(equalToConstant: 200),
button.heightAnchor.constraint(equalToConstant: 50)
])
Основные принципы Auto Layout:
- Ограничения (Constraints): Уравнения вида
view1.attribute = view2.attribute * multiplier + constant(например,button.leading = superview.leading + 20). - Приоритеты (Priority): Разрешают конфликтующие ограничения (значение от 1 до 1000).
- Внутренний размер (Intrinsic Content Size): Такие элементы, как
UILabelилиUIButton, сообщают системе свой "естественный" размер на основе контента. - Классы размеров (Size Classes): Позволяют задавать разные наборы ограничений для различных устройств и ориентаций (например,
compactvsregular).
Альтернатива: Ручная компоновка через установку свойства frame. Auto Layout предпочтительнее для создания адаптивных интерфейсов, поддерживающих разные размеры экранов.
Ответ 18+ 🔞
Так, слушай, разберём эту вашу UIKit-вскую магию, Auto Layout называется. Это ж не просто там рамки рисовать, это целая наука, блядь, с уравнениями и приоритетами. Представь, что каждую вашу кнопочку и лейбл нужно привязать к чему-то невидимому, как собаку на хуйню верёвкой, чтобы она никуда не сбежала при повороте экрана. Вот это и есть ограничения, constraints.
Вот смотри, простейший пример: Хочешь кнопку по центру экрана воткнуть, чтоб она как пуп земли? Делай так:
let button = UIButton(type: .system)
view.addSubview(button)
button.translatesAutoresizingMaskIntoConstraints = false // Это, сука, ВАЖНО! Иначе всё пиздец!
NSLayoutConstraint.activate([
// Привязываем центр кнопки к центру родителя. Всё, приехали.
button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
button.centerYAnchor.constraint(equalTo: view.centerYAnchor),
// И задаём ей размер, а то она сожмётся в пизду, в свою внутреннюю сущность
button.widthAnchor.constraint(equalToConstant: 200),
button.heightAnchor.constraint(equalToConstant: 50)
])
А теперь, блядь, основные киты, на которых этот цирк держится:
- Ограничения (Constraints): Это типа
view1.attribute = view2.attribute * multiplier + constant. Выглядит как математика, от которой в школе блевать хотелось. По факту: «ведущий край моей кнопки = ведущий край супервью + 20 точек, и не еби мозг». - Приоритеты (Priority): А это, ёпта, когда два ограничения начинают спорить, кто главнее. Система смотрит: у кого приоритет 1000 (обязательный) — тот и прав. У кого 999 — тот идёт нахуй, и его уравнение игнорируют. Хитро, да?
- Внутренний размер (Intrinsic Content Size): Вот это гениально. Такие штуки как
UILabelсами знают, какого они размера, исходя из текста внутри. Не надо им ширину-высоту указывать, они не дураки. Но если места мало — текст обрежется, и будет тебе, хитрая жопа, многоточие. - Классы размеров (Size Classes): Это уже для полных извращенцев. Позволяет на одном экране для айпада в альбоме и айфона в портрете иметь РАЗНЫЕ наборы ограничений. Compact, regular… Чистая магия, но когда работает — волнение ебать.
Альтернатива? Да, можно по-старинке, в каменном веке: брать и руками выставлять каждому виду его frame (координаты X, Y, ширина, высота). Но это, блядь, как строить дом без проекта: на одном экране красиво, а на другом все элементы наезжают друг на друга, как пьяные в подъезде. Auto Layout, при всей его ебучей сложности, эту проблему решает.