Переваги, проблеми, приклади додавання іншого вікна інтерфейсу користувача до програми 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.