В чем разница между UIView, UIWindow и CALayer?

«В чем разница между UIView, UIWindow и CALayer?» — вопрос из категории UIKit, который задают на 31% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Эти три класса представляют разные уровни абстракции в отрисовке и управлении интерфейсом iOS.

Компонент Уровень Основная ответственность Обработка событий
CALayer Низкий (Core Animation) Рендеринг и анимация графического контента. Нет. Это просто битмап в памяти.
UIView Высокий (UIKit) Контейнер для CALayer, управление layout, обработка пользовательских событий (тапы, жесты). Да. Наследует от UIResponder.
UIWindow Высокий (UIKit) Корневой контейнер для UIView, координация отображения и распределения событий (hit-testing). Да. Наследует от UIViewUIResponder).

Иерархия и взаимосвязь:

  1. UIWindow — это специальный UIView, который является корнем иерархии вью. Обычно в приложении есть одно главное окно.
  2. UIView — это основной строительный блок UI. Каждая вью имеет связанный с ней корневой CALayer (доступ через свойство .layer), который отвечает за фактическую отрисовку.
  3. CALayer — это легковесный объект, который рисует себя на экране. Вью делегирует ему задачи отрисовки (drawRect: -> draw(in:)) и анимации.

Почему такое разделение?

  • Производительность: CALayer оптимизирован для рендеринга и анимации, не перегружен логикой UIKit.
  • Гибкость: Можно использовать CALayer напрямую для сложной графики без накладных расходов UIView.
  • Архитектура: Разделение модели (данные слоя) и контроллера (логика вью).

Пример настройки через слой:

let customView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
// Все визуальные свойства (тень, скругление, граница) настраиваются у слоя
customView.layer.cornerRadius = 10
customView.layer.borderWidth = 2
customView.layer.borderColor = UIColor.blue.cgColor
customView.layer.shadowOpacity = 0.5

// Окно содержит вью
let window = UIWindow(frame: UIScreen.main.bounds)
window.rootViewController = UIViewController()
window.makeKeyAndVisible()
window.addSubview(customView)

Ключевой вывод: UIView — это управляемый, интерактивный «контроллер» для своего CALayer. UIWindow — это специальная вью-контейнер верхнего уровня.