Преимущества, проблемы, примеры добавления другого UIWindow в приложение iOS?

Недавно мне стало интересно, что приложение iOS имеет только один UIWindow. Кажется, что это не проблема для создания другого UIWindow и размещения его на экране.

Мой вопрос нечеткий, но меня интересует:

  • Что я могу достичь с помощью второго UIWindow, который не может быть выполнен другими способами?
  • Что может быть неправильным при использовании нескольких экземпляров UIWindow?
  • Я видел, что люди используют 2-й UIWindow для отображения popover, как представления на iPhone. Это хороший способ сделать это? Зачем? Почему бы и нет?
  • Есть ли другие примеры, в которых имеет смысл иметь еще один UIWindow?

Это не то, что я что-то упускаю. Я никогда не чувствовал необходимости создавать еще один экземпляр UIWindow, но, возможно, это позволит делать потрясающие вещи, о которых я не знаю!: -)

Я надеюсь, что это поможет мне решить эту проблему: Мне нужно добавить "обложку" над тем, что в данный момент отображается. Он также должен работать, если уже есть один или несколько модальных контроллеров. Если я добавлю UIView в представление корневого контроллера, модальные контроллеры будут сидеть сверху, так же как и контроллеры popover. Если я представляю вид крышки по-модульному, и уже есть модальный контроллер, покрывается только часть экрана.

Ответ 1

A UIWindow может плавать над другими элементами интерфейса, такими как системная клавиатура.

Чтобы обратиться к вашему последнему абзацу: Сделайте UIWindow с тем же фреймом, что и ваше главное окно. Установите для свойства windowLevel значение UIWindowLevelStatusBar. Установите для свойства hidden значение NO.

Ответ 2

Начиная с ответа Роба я немного поиграл и хотел бы записать несколько заметок для других, пытающихся получить информацию по этой теме:

  • Это не проблема, чтобы добавить еще один UIWindow. Просто создайте один и makeKeyAndVisible. Готово.
  • Удалите его, сделав другое окно видимым, затем отпустите тот, который вам больше не нужен.
  • Окно, которое является "ключом", получает все входные данные клавиатуры.
  • UIWindow охватывает все, даже модалы, popovers и т.д. Блестящий!
  • UIWindow - это всегда портрет неявно. Он не вращается. Вам нужно будет добавить контроллер в качестве нового корневого контроллера окна и разрешить его вращение. (Как и в главном окне)
  • Уровень окна определяет, как "высокий" он отображается. Установите его на UIWindowLevelStatusBar, чтобы он покрыл все. Установите для свойства hidden значение NO.
  • 2-й UIWindow можно использовать для отображения просмотров на экране, который плавает поверх всего. Не создавая фиктивный контроллер, чтобы вставить его в UIPopoverController.
  • Это может быть особенно полезно на iPhone, где нет контроллера popover, но где вы можете подражать чему-то вроде этого.
  • И да, это, конечно, решило мою проблему: если приложение уходит в отставку, добавьте окно обложки поверх того, что в настоящее время отображается, чтобы предотвратить запуск снимок экрана вашего приложения.