В каких сценариях используется несколько UIWindow в iOS?

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

Ответ

Основные сценарии использования нескольких окон:

  1. Кастомные системные оверлеи

    • Всплывающие окна, тосты, кастомные алерты
    • Пример: баннеры поверх всего контента
  2. Поддержка внешних дисплеев

    // Создание окна для внешнего экрана
    if let externalScreen = UIScreen.screens.first(where: { $0 != .main }) {
       let externalWindow = UIWindow(frame: externalScreen.bounds)
       externalWindow.screen = externalScreen
       externalWindow.rootViewController = ExternalDisplayVC()
       externalWindow.isHidden = false
    }
  3. Экран блокировки/заставки

    • Отображение контента поверх пароля/Touch ID
  4. Picture-in-Picture (PiP) и плавающие окна

  5. Отладка и разработка

    • Окно для логов, FPS-метра, инструментов разработчика

Критически важные параметры:

let alertWindow = UIWindow(frame: UIScreen.main.bounds)

// Уровень окна определяет порядок наложения:
alertWindow.windowLevel = .alert + 1  // Выше стандартных алертов
alertWindow.windowLevel = .statusBar + 1  // Выше статус-бара

// Для основного окна:
UIApplication.shared.windows.first?.windowLevel = .normal

// Управление видимостью:
alertWindow.isHidden = false
alertWindow.makeKeyAndVisible()  // Делает окно ключевым

Рекомендации:

  • Всегда управляйте жизненным циклом дополнительных окон
  • Не создавайте окна без необходимости (потребление памяти)
  • Используйте windowLevel для контроля порядка отображения
  • Для кастомных алертов рассмотрите UIViewController с модальным презентом