В чем разница между заданием frame и использованием constraints (Auto Layout) в UIKit?

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

Ответ

Это два принципиально разных подхода к определению геометрии UIView.

Frame (Прямое задание рамки)

  • Что это: Прямое назначение прямоугольника (CGRect), определяющего относительно родительской системы координат:
    • origin (x, y) — положение верхнего левого угла.
    • size (width, height) — размеры.
  • Характеристики:
    • Статичный: Не адаптируется автоматически к изменениям размеров супервью (например, при повороте устройства).
    • Производительный: Минимальные накладные расходы на вычисления.
    • Пример:
      let customView = UIView()
      customView.frame = CGRect(x: 20, y: 100, width: 200, height: 44)
      parentView.addSubview(customView)

Constraints (Auto Layout — Ограничения)

  • Что это: Система декларативных правил (ограничений), которые описывают отношения между атрибутами видов (leading, top, width, centerX и т.д.). Система автоматически вычисляет frame на основе этих правил.
  • Характеристики:

    • Адаптивный и динамичный: Позволяет создавать интерфейсы, которые автоматически перестраиваются под разные размеры экранов, ориентации и контент.
    • Более сложный: Требует понимания системы приоритетов, активации/деактивации.
    • Пример (программно):

      let customView = UIView()
      customView.translatesAutoresizingMaskIntoConstraints = false
      parentView.addSubview(customView)
      
      NSLayoutConstraint.activate([
          customView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 20),
          customView.topAnchor.constraint(equalTo: parentView.topAnchor, constant: 100),
          customView.widthAnchor.constraint(equalToConstant: 200),
          customView.heightAnchor.constraint(equalToConstant: 44)
      ])
Сравнение и рекомендации: Аспект Frame-based Layout Auto Layout (Constraints)
Адаптивность Низкая, требует ручного пересчета Высокая, автоматическая подстройка
Сложность Низкая для простых случаев Высокая, требует понимания системы
Производительность Высокая Может быть ниже при сложных иерархиях
Когда использовать Кастомная анимация, draw(_:), высокопроизводительные scroll views, очень простые фиксированные layout'ы. Подавляющее большинство случаев — создание адаптивных интерфейсов.

Важно: Нельзя смешивать подходы для одного view без отключения translatesAutoresizingMaskIntoConstraints = false. Auto Layout в конечном счете всегда вычисляет frame view.