Как создать и управлять кастомным UIWindow в UIKit?

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

Ответ

Да, создание собственных экземпляров UIWindow поддерживается. Это используется для кастомных оверлейных окон (например, для алертов, Picture-in-Picture или отдельного интерфейсного слоя).

Базовый пример создания:

// 1. Создание окна
let customWindow = UIWindow(frame: UIScreen.main.bounds)

// 2. Назначение корневого контроллера
customWindow.rootViewController = MyCustomViewController()

// 3. Установка уровня окна (z-позиция)
customWindow.windowLevel = .alert + 1 // Выше системных алертов

// 4. Активация окна
customWindow.makeKeyAndVisible()

// 5. Важно: сохраните сильную ссылку на окно!
self.customWindowHolder = customWindow

Ключевые аспекты:

  • Уровень окна (windowLevel): Определяет порядок наложения окон. Используйте .statusBar, .alert, .normal или кастомные значения.
  • Управление жизненным циклом: Объект UIWindow должен быть сохранен в сильном свойстве, иначе он будет немедленно деаллоцирован после выхода из области видимости.
  • Сокрытие окна: Для скрытия используйте customWindow.isHidden = true. Не вызывайте removeFromSuperview, так как окно не является view.
  • Основное окно: Система автоматически создает keyWindow при запуске приложения. Кастомные окна обычно являются дополнительными.