2010-04-19 15 views
27

Quiero crear una vista (UIControl) que bloquee todas las entradas y muestre un UIActivityIndicatorView mientras se autentica un usuario.Agregar UIView sobre todas las demás vistas, incluyendo StatusBar

UIActionSheet y UIAlertView logran agregar una vista semitransparente negra sobre la parte superior de todas las otras vistas para bloquear la entrada y me gustaría hacer algo similar.

He intentado agregar mi vista a la ventana UI superior en la matriz [[UIApplication sharedApplication] windows], y si bien esta la coloca encima del UIKeyboard si está visible, no la coloca sobre la Barra de estado (que tiene sentido).

Mi próximo intento fue extender UIAlertView, eliminar todas sus subvistas y establecer su layer.contents = nil, luego agregar el ActivityIndicator como una subvista. Esto funciona bien, pero parece que no puedo matar la transición anómala predeterminada de UIAlertView cuando lo llamas a "mostrar".

¿Alguien tiene alguna indicación sobre la mejor manera de abordar este problema que me da un control total?

Ah, y sé que la entrada de bloqueo no es buena, pero me aseguro de que sea por un corto período de tiempo y tiene la ventaja de dejar en claro al usuario que su acción, que debe completar para que progresen, está procesando .

+2

¿Por qué "cubrir" la barra de estado? ¿Por qué no ocultarlo, ser translúcido o simplemente ignorarlo por completo? La barra de estado no responde a los toques, si no recuerdo mal. –

+5

Quiero que parezca que está debajo de la vista de superposición. Esto deja en claro al usuario que no puede interactuar actualmente. Hacerlo translúcido no lo logra desafortunadamente, y esconderlo se vería extraño solo por la duración de la autenticación. Y responde a los toques. El valor predeterminado es desplazar UIScrollView activo a la parte superior. –

Respuesta

51

que he hecho un poco más de la excavación alrededor de la API y creo que lo he resuelto.

Para mostrar una vista en toda la pantalla, necesita crear su propia ventana UI y establecer su propiedad windowLevel para que sea UIWindowLevelStatusBar. Luego puede agregar sus subvistas personalizadas a esta ventana.

Tenga en cuenta que Apple no alienta, pero tampoco prohíbe la creación de varias ventanas.

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

Cuando se desea eliminar la ventana de la pantalla parece que lo suelte de la memoria.

[statusWindow release]; 

Esto no se siente totalmente seguro, pero no me sale algún error y parece caer fuera de la matriz de las ventanas de la UIApplication. Por favor, avíseme si esto está mal.

Actualización:

Otro asunto que me encontré era el UIStatusBar no teniendo eventos de toque para desplazarse por la UIScrollView activa a la parte superior después de haber visualizado y eliminado esta ventana superpuesta. La solución fue volver a establecer la ventana principal en la ventana clave una vez que se haya liberado la superposición.

[primaryWindow makeKeyWindow]; 
+2

Este código no funciona para mí en iOS 4.2. Aparecerá la ventana de estado, pero no sobre la barra de estado predeterminada proporcionada por el sistema operativo. ¿Algun consejo? ¿Aún funciona para ti a partir de iOS 4.2? – jbrennan

+0

Funciona, pero cuando presento un ViewController animado, mi ventana, que tiene un indicador de actividad va detrás del ViewController presentado, ¿alguna solución a este problema? –

+1

esto falló cuando trato de rotar la interfaz a la orientación horizontal. The statusWindow simplemente se adhiere a la posición de la barra de estado de origen. –

1

estoy a punto de hacer lo mismo en breve y piensan que la

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

parece que tiene todo lo que busca para

+0

Gracias por el enlace, pero esto no cubre la barra de estado de lo que puedo ver. Busco una vista semitransparente que abarque toda la zona de la interfaz de usuario. –

5

Necesitaba presentar una vista en la parte superior de todas las otras vistas dentro de mi ventana principal. Inicialmente, pensé en presentar otra ventana en la parte superior de la ventana de mi llave. Dado que Apple desalienta el uso de varias ventanas, decidí no hacerlo.

El código siguiente hizo el truco para mí:

he añadido mi punto de vista como una vista sub a mi ventana llave que presenta automáticamente mi punto de vista en la parte superior de todas las demás vistas. En mi caso este es el código de delegado de aplicación

[self.window addSubview:topViewController.view] 

Y cuando he terminado con la vista, el siguiente código elimina de la ventana.

[topViewController.view removeFromSuperview]; 
+2

esto no cubrirá la barra de estado – OpenThread

+0

De alguna manera en la aplicación de paisaje esto agrega vista en el retrato y esto se ve muy tonto. – Dvole

Cuestiones relacionadas