2012-03-25 16 views
22

I tienen una vista actividad que he añadido en la clase AppDelegate para aprovechar bar:IOS: ¿Cómo poner un poco de vista encima del controlador de vista modal presentado?

[self.mainTabBar.view addSubview: spinner]; 

Cuando hay problemas de conexión es visible en cada controlador de vista y está girando. Hay algún botón en cierto controlador de vista, lo que hace que se presente un controlador de vista modal. Ese controlador de vista modal se superpone al girador. ¿Cómo hacer que ese spinner siempre esté encima de todas las vistas o al menos encima de ese controlador de vista modal? Traté de hacer tal cosa en controlador de vista que presenta controlador de vista modal:

[self presentModalViewController:selectionViewController animated:YES]; 
[self.view bringSubviewToFront:[self.tabBarController.view viewWithTag:15]]; 
No

obras.

Respuesta

60

Agregue la vista a la ventana principal.

UIWindow* mainWindow = [[UIApplication sharedApplication] keyWindow]; 
[mainWindow addSubview: spinner]; 
+8

Aunque esto no responderá correctamente a los cambios de orientación. Para eso, necesita usar algo como UIView * view = mainWindow.subviews [0]; [ver addSubview: spinner]; –

+0

Acabas de resolver mi problema (un poco no relacionado), ¡gracias! – bpiec

+0

Bien, pero ¿cómo eliminarlo de otro procedimiento, @ phix23? – new2ios

0

El controlador modal está en una capa completamente diferente, no puede hacer que ninguna subvista del controlador presente se solape.

Usa un UIAlertView con un rotor dentro. Las alertas se muestran en una capa que se superpone incluso a los controladores modales.

+0

Esto no es verdad. Mientras que las vistas de alerta se encuentran en una capa separada encima de todo lo demás, los modales no se pueden anular y se pueden reemplazar con el código que publiqué a continuación. –

+0

@MaciejSwic Sé cómo agregar subvistas a la ventana, tenga en cuenta que mi respuesta era 'cualquier subvista del controlador de la presentación '. Usar 'UIAlertView' es técnicamente una mejor solución. – Sulthan

12

Si bien la respuesta de phix23 es correcta, aquí es un ejemplo más completo:

//The view you want to present 
UIViewController *viewControllerYouWantToPresentOnTop = [[UIViewController alloc] initWithNibName:nil bundle:nil]; 

//Create transparent host view for presenting the above view 
UIWindow* mainWindow = [[UIApplication sharedApplication] keyWindow]; 
UIViewController *viewControllerForPresentation = [[UIViewController alloc] init]; 
[[viewControllerForPresentation view] setBackgroundColor:[UIColor clearColor]]; 
[[viewControllerForPresentation view] setOpaque:FALSE]; 
[mainWindow addSubview:[viewControllerForPresentation view]]; 

//Make your transparent view controller present your actual view controller 
[viewControllerForPresentation presentViewController:viewControllerYouWantToPresentOnTop animated:TRUE]; 

Recuerde que limpiar después de ti mismo cuando no los necesitas más tiempo.

Este código puede ser utilizado desde cualquier lugar de su aplicación, incluso una biblioteca :)

+0

La mejor que he encontrado hasta ahora, pero esto hace que las llamadas desbalanceadas comiencen/finalicen las transiciones de aparición '. –

+0

@ meaning-matters ¿Tiene otras animaciones pasando al mismo tiempo? Es posible que desee esperar a que terminen. –

+0

No hay otras animaciones, me temo. Gracias por responder rápidamente @Maciej. –

4

Una aplicación suele mostrar su contenido en una sola ventana lo largo de su vida. Pero hay situaciones en las que se puede usar una ventana adicional para agregar contenido encima de todo lo demás. Apple asegura que UIAlertView siempre permanece en la parte superior al agregarlo en una ventana separada.

UIView *contentView = [[UIView alloc] initWithFrame:contentFrame]; 
contentView.backgroundColor = [UIColor greenColor]; 
UIWindow *window = [[UIWindow alloc] initWithFrame:CGRectMake(x,y,contentFrame.size.width, contentFrame.size.height)]; 
window.windowLevel = UIWindowLevelAlert; 
[window addSubview:contentView]; 
[window makeKeyAndVisible]; 

Mostrar y ocultar la ventana mediante el establecimiento de window.hidden = Yes or No según sea necesario. Esto siempre mostrará su contentView encima de todo lo demás en la aplicación.

Cuestiones relacionadas