Что такое констрейнт (NSLayoutConstraint) в Auto Layout?

«Что такое констрейнт (NSLayoutConstraint) в Auto Layout?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

NSLayoutConstraint (констрейнт) — это объект, который описывает математическое соотношение между атрибутами (layout attributes) двух элементов интерфейса или элемента и его супервью в системе Auto Layout. Он определяет правила для позиционирования и задания размеров.

Основные компоненты констрейнта:

  • firstItem, firstAttribute: Первый элемент и его атрибут (например, .leading, .centerY, .width).
  • relation: Соотношение (==, >=, <=).
  • secondItem, secondAttribute: Второй элемент и его атрибут.
  • multiplier & constant: Множитель и константа для линейного уравнения: firstAttribute = secondAttribute * multiplier + constant.
  • priority: Приоритет (UILayoutPriority) от 1 до 1000 для разрешения конфликтов.
  • isActive: Флаг активности констрейнта.

Пример создания и активации констрейнтов:

let button = UIButton()
view.addSubview(button)
// 1. Обязательный шаг
button.translatesAutoresizingMaskIntoConstraints = false

// 2. Создание и активация
NSLayoutConstraint.activate([
    // Центрирование по X и Y
    button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    button.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    // Фиксированная ширина и высота
    button.widthAnchor.constraint(equalToConstant: 200),
    button.heightAnchor.constraint(equalToConstant: 50)
])

Важные нюансы:

  • translatesAutoresizingMaskIntoConstraints = false необходимо устанавливать для всех элементов, чьи констрейнты задаются вручную.
  • Для создания однозначной и непротиворечивой (satisfiable) системы констрейнтов необходимо задать положение (X, Y) и размер (ширина, высота) для каждого элемента.
  • Динамическое включение/отключение констрейнтов через isActive эффективнее, чем их удаление и повторное создание.