Подтвердить что ты не робот

Добавить UIView над всеми другими видами, включая StatusBar

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

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

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

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

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

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

4b9b3361

Ответ 1

Я проделал еще несколько операций по 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];

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

Update:

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

[primaryWindow makeKeyWindow];

Ответ 2

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

Следующий код сделал для меня трюк:

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

[self.window addSubview:topViewController.view]

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

[topViewController.view removeFromSuperview];

Ответ 3

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

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

Похоже, у него есть все, что вы ищете