Я создаю многоразовую структуру для отображения уведомлений в приложении iOS. Я бы хотел, чтобы представления уведомлений были добавлены поверх всего остального в приложении, вроде как UIAlertView. Когда я запускаю диспетчер, который прослушивает события NSNotification и добавляет представления в ответ, мне нужно получить ссылку на самое верхнее представление в приложении. Вот что у меня есть на данный момент:
_topView = [[[[UIApplication sharedApplication] keyWindow] subviews] lastObject];
Будет ли это работать для любого приложения iOS или это более безопасный / лучший способ получить вид сверху?
источник
(null)
приложение для iOS-8 (проблема с раскадровкой?) Есть подсказки? Спасибо! (Примечание:(null)
возвращено одновременноviewDidLoad
иviewWillAppear:
вовремя.viewDidAppear:
Слишком поздно.Проблема состоит из двух частей: верхнее окно, вид сверху на верхнее окно.
Все существующие ответы не попали в верхнюю часть окна. Но
[[UIApplication sharedApplication] keyWindow]
не гарантируется, что будет верхнее окно.Верхнее окно. Очень маловероятно, что
windowLevel
для приложения будет два окна с одинаковым сосуществованием, поэтому мы можем отсортировать все окнаwindowLevel
и получить самое верхнее.Вид сверху на верхнее окно. Просто чтобы быть полным. Как уже указывалось в вопросе:
источник
topView = [[[[UIApplication sharedApplication] keyWindow] subviews] lastObject];
На самом деле в вашем приложении может быть более одного UIWindow. Например, если на экране отображается клавиатура, тогда
[[UIApplication sharedApplication] windows]
будет как минимум два окна (ваше ключевое окно и окно клавиатуры).Поэтому, если вы хотите, чтобы ваше представление отображалось поверх них обоих, вам нужно сделать что-то вроде:
(Предполагается, что lastObject содержит окно с наивысшим приоритетом windowLevel).
источник
Я придерживаюсь вопроса в названии, а не обсуждения. Какой вид лучше всего виден в любой точке?
Может использоваться напрямую с любым UIWindow как получателем или любым UIView как получателем.
источник
Если вы добавляете представление загрузки (например, представление индикатора активности), убедитесь, что у вас есть объект класса UIWindow. Если вы показываете лист действий непосредственно перед тем, как вы показываете вид загрузки, то
keyWindow
будет,UIActionSheet
а неUIWindow
. И так как лист действий исчезнет, представление загрузки исчезнет вместе с ним. Или вот что вызывало у меня проблемы.источник
Если ваше приложение работает только в портретной ориентации, этого достаточно:
И ваше представление не будет отображаться над клавиатурой и строкой состояния.
Если вы хотите получить самый верхний вид, который находится над клавиатурой или строкой состояния, или вы хотите, чтобы самый верхний вид мог правильно вращаться с устройствами, попробуйте эту структуру:
https://github.com/HarrisonXi/TopmostView
Он поддерживает iOS7 / 8/9.
источник
Просто используйте этот код, если хотите добавить вид сверху всего на экране.
источник
попробуй это
источник
источник