Добавить UIView выше всех других представлений, включая StatusBar - PullRequest
28 голосов
/ 19 апреля 2010

Я хочу создать представление (UIControl), которое блокирует весь ввод и отображает UIActivityIndicatorView при аутентификации пользователя.

UIActionSheet и UIAlertView удается добавить черный полупрозрачный вид поверх всех других видов, чтобы заблокировать ввод, и я хотел бы сделать аналогичное.

Я попытался добавить мой вид в верхнее окно UIWindow в массиве [[UIApplication sharedApplication] windows], и хотя он размещает его над UIKeyboard, если он виден, он не помещается над StatusBar (что делает чувство).

Моя следующая попытка состояла в том, чтобы расширить UIAlertView, удалить все его подпредставления и установить его layer.contents = nil, затем добавить ActivityIndicator в качестве подпредставления. Это хорошо работает, но я не могу убить оживленный переход по умолчанию UIAlertView, когда вы вызываете его как «show».

Есть ли у кого-нибудь указания на лучший способ решения этой проблемы, который дает мне полный контроль?

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

Ответы [ 3 ]

52 голосов
/ 20 апреля 2010

Я еще немного покопался в API и, думаю, у меня получилось.

Чтобы отобразить вид на весь экран, вам нужно создать свой собственный UIWindow и установить для его свойства windowLevel значение UIWindowLevelStatusBar. Затем вы можете добавить свои собственные подпредставления в это окно.

Обратите внимание, что Apple не поощряет, но и не запрещает создание нескольких окон.

UIWindow *statusWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
statusWindow.windowLevel = UIWindowLevelStatusBar;
statusWindow.hidden = NO;
statusWindow.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.7];
[statusWindow makeKeyAndVisible];

Когда вы хотите удалить окно с экрана, оно выглядит так, как будто вы освобождаете его из памяти.

[statusWindow release];

Это не кажется абсолютно безопасным, но я не получаю никаких ошибок, и кажется, что он выпадает из массива windows UIApplication. Пожалуйста, дайте мне знать, если это не так.

Обновление:

Еще одна проблема, с которой я столкнулся, заключалась в том, что UIStatusBar не принимал сенсорные события для прокрутки активного UIScrollView наверх после того, как я отобразил и удалил это окно наложения. Решение состояло в том, чтобы вернуть главное окно обратно к ключевому окну после снятия наложения.

[primaryWindow makeKeyWindow];
5 голосов
/ 23 мая 2011

Мне нужно было представить вид поверх всех других видов в моем главном окне. Сначала я подумал о том, чтобы представить еще одно окно поверх моего ключевого окна. Поскольку Apple не рекомендует использовать несколько окон, я отказался от этого.

Следующий код помог мне:

Я добавил свой вид как вспомогательный вид в мое ключевое окно, которое автоматически представляет мой вид поверх всех других видов. В моем случае этот код находится в делегате приложения

[self.window addSubview:topViewController.view]

И когда я закончу с представлением, следующий код удаляет его из окна.

[topViewController.view removeFromSuperview];
1 голос
/ 19 апреля 2010

Я собираюсь сделать то же самое в ближайшее время и обнаружил следующее

http://www.dejal.com/developer/dsactivityview

Похоже, там есть все, что вы ищете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...