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

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

Мой вопрос немного расплывчат, но меня интересует:

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

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

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

Ответы [ 3 ]

103 голосов
/ 23 ноября 2011

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

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

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

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

0 голосов
/ 08 января 2019

Вот Документация Apple для лучшего понимания UIWindow: https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html

Одна хорошая, хотя и конкретная причина использовать несколько экземпляров UIWindow - это когда вам нужно записать видео с экрана приложения. Возможно, вы не захотите включать определенные элементы (кнопку записи, статус записи и т. Д.) В окончательно записанное видео, поэтому вы можете поместить эти элементы в отдельное окно UIWindow сверху.

На самом деле, если вы используете ReplayKit, вам придется использовать отдельное окно UIWindow для этих исключенных элементов интерфейса. Больше информации здесь: https://medium.com/ar-tips-and-tricks/how-to-record-a-screen-capture-with-replaykit-whilst-hiding-the-hud-element-bedcca8e31e

...