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


92

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

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

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

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

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


Использование нескольких UIWindows в приложениях iOS shaune.com.au/using-multiple-uiwindows-in-ios-applications
onmyway133

Ответы:


27

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

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


Эээ, ладно. Спасибо. Я знал это. Не могли бы вы подробнее рассказать о моих вопросах? Вы знаете, как получить RID секундного UIWindow, добавленного makeKeyAndVisible?
Krumelur

Установите для второго скрытого свойства UIWindow значение YES.
rob mayoff

Спасибо. И я показываю окно, сделав его ключевым и видимым? И я скрываю это, делая ДРУГОЕ окно видимым и просто удаляя другое? Как я могу анимировать UIWindow, как это делает UIActionSheet?
Krumelur

Будьте осторожны с этим. Если! = UIWindowLevelNormal, клавиатура будет отображаться под ним на <iOS7.
Шон

108

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

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

У меня не хватило бы смелости использовать другой UIWindow, если бы не ваш ответ. Это также было чрезвычайно полезно, потому что второе UIWindow не могло автоматически автоповоротить.
Дэн Абрамов

1
Очень поучительный пост. Но что произойдет, если вы откажетесь от этого окна и сделаете основной ключ окна видимым, а rootViewController этого базового окна имеет модальный контроллер, представленный в настоящее время? Будет ли он снова представлять контроллер модального представления? Что происходит в нашем приложении, так это то, что rootViewController представлен не модальным ...
Нава Кармон,

@Krumelur Это нормально. Я сомневаюсь. Это, скажем, второе окно UIWindow, которое отображается поверх всех текущих представлений. Когда пользователь нажимает одну кнопку в представлении, которое находится в 1-м UIWindow, которое представляет еще один контроллер представления. Этот второй UIWindow скроется. Как сделать так, чтобы этот UIWindow всегда отображался во всем приложении.
Easwaramoorthy K

1
Я постоянно использую UIWindow для реализации пользовательских стилевых представлений предупреждений и всплывающих окон iphone. Это помогает всегда делать вид полноэкранным, содержащим полноэкранный вид и встраиванием другого «содержимого» -просмотра внутри, чтобы внешний вид улавливал любые события касания (и поэтому я могу добавить красивую тень и затемнить другой контент ^^)
Мартин Ульрих

3
Следует отметить, что второе окно сохраняется не только для того, чтобы быть видимым (в отличие от обычных представлений, сохраняемых их супервизором).
Rivera

0

Вот документация 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.