2010-04-19 1 views
27

Я хочу создать представление (UIControl), которое блокирует все входные данные и показывает UIActivityIndicatorView при аутентификации пользователя.Добавить UIView Above All Other Views, включая StatusBar

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

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

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

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

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

+2

Зачем нужна «крышка» в строке состояния? Почему бы не скрыть это, будь то полупрозрачным или просто игнорировать его полностью? Строка состояния не реагирует на касания, если я правильно помню. –

+5

Я хочу, чтобы это выглядело так, будто оно находится под наложением. Это позволяет пользователю понять, что они не могут взаимодействовать в настоящее время. Сделать это полупрозрачным не достигла этого, к сожалению, и скрыть это выглядела бы странно, если бы только на время аутентификации. И он действительно реагирует на прикосновения. По умолчанию используется прокрутка активного UIScrollView до вершины. –

ответ

51

я сделал некоторые более копать вокруг 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

Этот код не работает для меня в iOS 4.2. Появится окно состояния, но не над статусной панелью по умолчанию, предоставляемой ОС. Какие-нибудь советы? Это все еще работает для вас с iOS 4.2? – jbrennan

+0

Это работает, но когда я представляю viewController animated, мое окно, которое имеет индикатор активности, выходит за представленный viewController, любые решения этой проблемы? –

+1

это не удалось, когда я пытаюсь повернуть интерфейс в альбомную ориентацию. StatusWindow просто придерживается позиции строки состояния начала. –

1

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

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

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

+0

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

5

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

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

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

[self.window addSubview:topViewController.view] 

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

[topViewController.view removeFromSuperview]; 
+2

это не будет отображаться в строке состояния – OpenThread

+0

Как-то в ландшафтном приложении это добавляет вид на портрете, и это выглядит очень глупо. – Dvole

Смежные вопросы