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

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

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

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

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

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


person Krumelur    schedule 22.11.2011    source источник
comment
Использование нескольких UIWindows в приложениях iOS shaune.com.au/using-multiple -uiwindows-in-ios-applications   -  person onmyway133    schedule 28.08.2014


Ответы (3)


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

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

person rob mayoff    schedule 22.11.2011
comment
Эээ, ладно. Спасибо. Я знал это. Не могли бы вы подробнее рассказать о моих вопросах? Вы знаете, как получить RID секундного UIWindow, добавленного makeKeyAndVisible? - person Krumelur; 23.11.2011
comment
Установите для второго скрытого свойства UIWindow значение YES. - person rob mayoff; 23.11.2011
comment
Спасибо. И я показываю окно, сделав его ключевым и видимым? И я скрываю это, делая ДРУГОЕ окно видимым и просто удаляя другое? Как я могу анимировать UIWindow, как это делает UIActionSheet? - person Krumelur; 23.11.2011
comment
Будьте осторожны с этим. Если! = UIWindowLevelNormal, клавиатура будет отображаться под ним на ‹iOS7. - person Shawn; 27.03.2014

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

  • Добавить еще UIWindow - совсем не проблема. Просто создайте один и makeKeyAndVisible. Выполнено.
  • Удалите его, сделав видимым другое окно, затем отпустите то, которое вам больше не нужно.
  • Окно, которое является «ключевым», получает весь ввод с клавиатуры.
  • UIWindow охватывает все, даже модальные окна, всплывающие окна и т. Д. Великолепно!
  • UIWindow всегда неявно портретный. Он не вращается. Вам нужно будет добавить контроллер в качестве корневого контроллера нового окна и позволить этому дескриптору вращаться. (Как и в главном окне)
  • Уровень окна определяет, насколько «высоко» оно отображается. Установите UIWindowLevelStatusBar, чтобы охватить все. Установите для свойства hidden значение NO.
  • Второй UIWindow можно использовать для вывода на экран представлений, плавающих поверх всего. Без создания фиктивного контроллера, просто чтобы встроить его в UIPopoverController.
  • Это может быть особенно полезно на iPhone, где нет всплывающего контроллера, но где вы можете имитировать что-то подобное.
  • И да, это, конечно, решило мою проблему: если приложение откажется от активации, добавьте окно-обложку поверх всего, что отображается в данный момент, чтобы iOS не сделала снимок экрана с текущим содержимым вашего приложения.
person Krumelur    schedule 23.11.2011
comment
У меня не хватило бы смелости использовать другой UIWindow, если бы не ваш ответ. Это также было чрезвычайно полезно, потому что второе UIWindow не могло автоматически автоповоротить. - person Dan Abramov; 20.09.2012
comment
Очень поучительный пост. Но что произойдет, если вы откажетесь от этого окна и сделаете основной ключ окна видимым, а rootViewController этого основного окна имеет модальный контроллер, представленный в настоящее время? Будет ли он снова представлять контроллер модального представления? Что происходит в нашем приложении, так это то, что rootViewController представлен не модальным ... - person Nava Carmon; 19.12.2012
comment
@Krumelur Это нормально. Я сомневаюсь. Скажем, второе окно UIWindow отображается поверх всех текущих представлений. Когда пользователь нажимает одну кнопку в представлении, которое находится в 1-м UIWindow, которое представляет еще один контроллер представления. Этот второй UIWindow скроется. Как сделать так, чтобы этот UIWindow всегда отображался во всем приложении. - person Easwaramoorthy K; 29.06.2013
comment
Я постоянно использую UIWindow для реализации пользовательских стилевых представлений предупреждений и всплывающих окон iphone. Это помогает всегда делать вид полноэкранным, содержащим полноэкранный вид и встраиванием другого вида содержимого внутри, чтобы внешний вид улавливал любые события касания (и поэтому я могу добавить красивую тень и затемнить мой другой контент ^^) - person Martin Ullrich; 15.07.2013
comment
Следует отметить, что второе окно сохраняется не только для того, чтобы быть видимым (в отличие от обычных представлений, сохраняемых их супервизором). - person Rivera; 03.03.2014
comment
По моему опыту, я не хотел, чтобы новое окно становилось keyWindow, потому что его целью было просто показать наложение, к которому пользователь не должен иметь возможности прикоснуться. Наличие этого неключевого оверлейного окна вызывало некоторые проблемы еще во времена iOS5 ~ iOS6, когда Apple представила контроллер представления модели словаря, который появляется при нажатии на определение, когда слово выбрано в текстовом представлении. - person nacho4d; 26.02.2015
comment
Я не знаю, существует ли проблема сейчас, но в iOS5 iOS6 отклонение контроллера представления словаря сделало мое приложение невосприимчивым. Он был еще жив, но событий не принимал. Ни одно из моих окон не получило события. Итак, я закончил тем, что создал свой вид наложения в первом окне :( - person nacho4d; 26.02.2015
comment
Я хотел бы, чтобы в то время документация была лучше и рассказывала, каков эффект наличия неключевого окна поверх ключевого окна. - Я не знаю ответа даже сейчас, кстати - person nacho4d; 26.02.2015
comment
третий пункт кажется неверным. Я создал два окна с rootViewController, имеющими текстовые поля, но одно из окон было initWithFrame, где фрейм был вставлен в границы основного экрана. Переключил ключевые окна и обнаружил, что оба текста можно редактировать. - person BangOperator; 06.05.2016

Вот документация Apple для лучшего понимания UIWindow: https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowAndScreenGuide/WindowScreenRolesinApp/WScreenRolesinApp.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

person Ivy Xing    schedule 08.01.2019