Adicionar UIView acima de todas as outras exibições, incluindo StatusBar

Eu estou querendo criar uma visão (UIControl) que bloqueia todas as inputs e mostra um UIActivityIndicatorView durante a autenticação de um usuário.

Tanto o UIActionSheet quanto o UIAlertView conseguem adicionar uma visualização semitransparente preta sobre todas as outras visualizações para bloquear a input e gostaríamos de fazer algo semelhante.

Eu tentei adicionar a minha visão para o topo UIWindow na matriz [[UIApplication sharedApplication]], e enquanto isso coloca-lo acima do UIKeyboard, se for visível, não o coloca sobre o StatusBar (o que faz sentido).

Minha próxima tentativa foi estender o UIAlertView, remover todas as suas subvisualizações e definir seu layer.contents = nil, depois adicionar o ActivityIndicator como uma subvisualização. Isso funciona bem, mas não consigo matar a transição bouncy padrão do UIAlertView quando você o chama para “show”.

Alguém tem alguma pointers para a melhor maneira de resolver este problema que me dá controle total?

Ah, e eu sei que a input de bloqueio não é grande, mas eu garanto que é por um curto período de tempo e tem a vantagem de deixar claro para o usuário que a ação deles, que deve ser completada para progredir, está sendo processada.

Eu fiz mais algumas pesquisas sobre a API e acredito que eu trabalhei.

Para exibir uma visualização em toda a canvas, você precisa criar sua própria UIWindow e definir sua propriedade windowLevel como UIWindowLevelStatusBar. Você pode adicionar suas subvisualizações personalizadas a essa janela.

Observe que a Apple não incentiva, mas também não proíbe a criação de várias janelas.

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]; 

Quando você deseja remover a janela da canvas, parece que você a libera da memory.

 [statusWindow release]; 

Isso não parece totalmente seguro, mas eu não recebo nenhum erro e ele parece sair do array de janelas do UIApplication. Por favor, deixe-me saber se isso está errado.

Atualizar:

Um outro problema que me deparei foi o UIStatusBar não tendo events de toque para rolar o UIScrollView ativo para o topo depois que eu tinha exibido e removido essa janela de sobreposição. A solução foi definir a janela principal de volta à janela da chave quando a sobreposição fosse liberada.

 [primaryWindow makeKeyWindow]; 

Eu precisava apresentar uma visão sobre todas as outras visões dentro da minha janela principal. Inicialmente, pensei em apresentar outra janela em cima da minha janela principal. Como a Apple desencoraja o uso de várias janelas, decidi contra isso.

O código a seguir fez o truque para mim:

Eu adicionei a minha visão como uma sub vista para a minha janela principal, que automaticamente apresenta a minha visão no topo de todas as outras visões. No meu caso, esse código está no delegado do aplicativo

 [self.window addSubview:topViewController.view] 

E quando eu terminar a exibição, o código a seguir a remove da janela.

 [topViewController.view removeFromSuperview]; 

Estou prestes a fazer a mesma coisa em breve e encontrei o seguinte

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

Parece que tem tudo o que você procura