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

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

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

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

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

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

2 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам