Переваги, проблеми, приклади додавання іншого вікна інтерфейсу користувача до програми iOS?


92

Нещодавно я задавався питанням про те, що додаток для iOS має лише один UIWindow. Здається, не проблема створювати іншу UIWindowта розміщувати її на екрані.

Моє запитання є неясним, але мене цікавить:

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

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

Я сподіваюся, що це може допомогти мені вирішити цю проблему: мені потрібно додати "вигляд обкладинки" над тим, що зараз відображається. Це також повинно працювати, якщо вже є один або кілька представлених модальних контролерів. Якщо я додаю a UIViewдо подання кореневого контролера, модальні контролери сидять зверху, так само і контролери popover. Якщо я представляю вигляд обкладинки модально і вже існує модальний контролер, покрита лише частина екрана.


Використання декількох інтерфейсів користувача Windows у додатках iOS shaune.com.au/using-multiple-uiwindows-in-ios-applications
— onmyway133

Відповіді:


26

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

Щоб вирішити свій останній абзац: Створіть такий UIWindowже кадр, що і ваше головне вікно. Встановіть для його windowLevelвластивості значення UIWindowLevelStatusBar. Встановіть для його hiddenвластивості значення NO.


Помилка, добре. Дякую. Я знаю це. Чи можете ви трохи детально розписати мої запитання? Чи знаєте ви, як отримати RID секунди UIWindow, яке було додано makeKeyAndVisible?
— Крумелур

Встановіть для прихованої властивості другого UIWindow значення YES.
— грабувати майофф

Дякую. І я показую вікно, роблячи його ключовим і видимим? І я приховую це, роблячи видимим ІНШЕ вікно і просто утилізуючи інше? Як я можу анімувати вікно інтерфейсу користувача, як UIActionSheet?
— Крумелур

Будьте обережні з цим. Якщо значення! = UIWindowLevelNormal, клавіатура відображатиметься під ним на <iOS7.
— Шон

108

Починаючи з відповіді Роба, я трохи погрався і хотів би записати деякі примітки для інших, які намагаються отримати інформацію на цю тему:

  • Це зовсім не проблема додати іншу UIWindow. Просто створіть один і makeKeyAndVisible. Готово.
  • Видаліть його, зробивши видимим інше вікно, а потім відпустіть те, що вам більше не потрібно.
  • Вікно, яке є "ключовим", отримує всі введення з клавіатури.
  • UIWindow охоплює все, навіть модальні форми, поповери тощо. Блискуче!
  • UIWindowзавжди є неявно портретним. Він не обертається. Вам доведеться додати контролер як кореневий контролер нового вікна і дозволити цьому обробляти обертання. (Так само, як і головне вікно)
  • Рівень вікна визначає, наскільки високим він відображається. Встановіть так, щоб UIWindowLevelStatusBarвін охоплював усе. Встановіть для його hiddenвластивості значення НІ.
  • Другий UIWindowможе бути використаний для відображення переглядів на екрані, які плавають поверх усього. Без створення фіктивного контролера, просто щоб вбудувати його в UIPopoverController.
  • Це може бути особливо корисно на iPhone, де немає контролера перемикання, але де ви можете імітувати щось подібне.
  • І так, це, звичайно, вирішило мою проблему: якщо додаток змириться з активацією, додайте вікно обкладинки над тим, що зараз показано, щоб не дати iOS зробити знімок екрана поточного вмісту вашої програми.

Я б не мав сміливості використати інше вікно інтерфейсу користувача, якби не ваша відповідь. Це також було надзвичайно корисно, оскільки друге вікно інтерфейсу користувача не могло самостійно обертатися.
— Дан Абрамов

1
Дуже просвітницький пост. Але що трапиться, якщо ви звілитеся з цього вікна і зробите основний ключ вікна видимим, і rootViewController цього базового вікна має модальний контролер, представлений в даний час? Чи буде він представляти контролер модального перегляду назад? У нашому додатку відбувається те, що rootViewController представлений не модальним ...
— Nava Carmon

@Krumelur Це добре. Я сумніваюся. Це, скажімо, друге вікно інтерфейсу користувача відображається поверх усіх поточних переглядів. Коли користувач натискає одну кнопку на поданні, яке знаходиться в 1-му вікні інтерфейсу користувача, яке представляє ще один контролер перегляду. Це друге вікно інтерфейсу користувача буде приховано. Як зробити так, щоб це вікно UIW відображалось завжди у всій програмі.
— Easwaramoorthy K

1
Я весь час використовую UIWindow для реалізації нестандартних стилів сповіщень та перегляду iphone. Це допомагає завжди робити повноекранний вигляд, що містить повноекранний вигляд та вбудовувати в нього інший "вміст" -погляд, щоб зовнішній вигляд фіксував будь-які події дотику (і тому я можу додати приємну тінь і затемнити мій інший вміст ^^)
— Мартін Улліх

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

0

Ось документація Apple для кращого розуміння інтерфейсу користувача: https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html

Хороша, хоча конкретна причина використання декількох екземплярів UIWindow - це коли вам потрібно записати екран програми на відео. Можливо, ви не захочете включати певні елементи (кнопку запису, стан запису тощо) до остаточного записаного відео, тому ви можете помістити ці елементи в окреме вікно інтерфейсу користувача зверху.

Насправді, якщо ви використовуєте ReplayKit, вам доведеться використовувати окреме вікно UIW для цих виключених елементів інтерфейсу. Більше інформації тут: 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.