Agregue un UIView sobre todo, incluso la barra de navegación

Quiero mostrar, sobre cualquier otra vista, incluso la barra de navegación, una especie de vista “emergente” que se ve así:

  • Fondo negro de pantalla completa con 0.5 alfa para ver el otro UIViewController debajo.
  • una ventana de UIView en el medio con algo de información, (un calendario si quieres saber todo).

Para hacer eso, he creado un UIViewController que contiene los dos UIViews (fondo y ventana), y estoy tratando de mostrarlo. He intentado con un simple [mySuperVC addSubview:myPopUpVC.view] , pero todavía tengo la barra de navegación arriba.

Intenté presentarlo como un modal, pero el UIViewController desaparece y pierdo mi efecto de transparencia.

Cualquier idea para hacer esto, estoy seguro de que es bastante simple …

¡Gracias!

Puede hacer eso agregando su vista directamente a la ventana clave:

 UIView *myView = /* <- Your custom view */; UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow; [currentWindow addSubview:myView]; 

[self.navigationController.view addSubview:overlayView]; es lo que realmente quieres

Aquí hay una solución simple y elegante que funciona para mí. Puede establecer la posición z de la barra de navegación debajo de la vista:

 self.navigationController.navigationBar.layer.zPosition = -1; 

Solo recuerde volver a establecerlo en 0 cuando haya terminado.

Versiones Swift para la respuesta comprobada:

Swift 4:

 let newView = UIView() UIApplication.shared.keyWindow?.addSubview(newView) 

Swift 3.1:

 let newView = UIView() UIApplication.sharedApplication().keyWindow?.addSubview(newView) 

Agregue su vista como la subvista de NavigationController.

 [self.navigationController.navigationBar addSubview: overlayView)] 

También puede agregarlo sobre la ventana:

 UIView *view = /* Your custom view */; UIWindow *window = [UIApplication sharedApplication].keyWindow; [window addSubview:view]; 

Espero que esto ayude.. 🙂

Dalef gran solución en rápido:

 self.navigationController?.view.addSubview(view) 

Hay más de una forma de hacerlo:

1- Añade tu UIView en UIWindow lugar de agregarlo en UIViewController . De esta manera estará encima de todo.

  [[(AppDelegate *)[UIApplication sharedApplication].delegate window] addSubview:view]; 

2- Usa una transición personalizada que mantendrá tu UIViewController mostrando en la parte posterior con un 0.5 alpha

Para eso te recomiendo que mires esto: https://github.com/Citrrus/BlurryModalSegue

Te recomiendo que crees una nueva UIWindow:

 UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; window.rootViewController = viewController; window.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; window.opaque = NO; window.windowLevel = UIWindowLevelCFShareCircle; window.backgroundColor = [UIColor clearColor]; [window makeKeyAndVisible]; 

Luego puede administrar su vista en otro UIViewController. Para eliminar las ventanas:

 [window removeFromSuperview]; window = nil; 

espero que ayude!

Versión Swift de la respuesta de @Nicolas Bonnet:

  var popupWindow: UIWindow? func showViewController(controller: UIViewController) { self.popupWindow = UIWindow(frame: UIScreen.mainScreen().bounds) controller.view.frame = self.popupWindow!.bounds self.popupWindow!.rootViewController = controller self.popupWindow!.makeKeyAndVisible() } func viewControllerDidRemove() { self.popupWindow?.removeFromSuperview() self.popupWindow = nil } 

No olvide que la ventana debe ser una propiedad fuerte, porque la respuesta original conduce a una desasignación inmediata de la ventana

 [[UIApplication sharedApplication].windows.lastObject addSubview:myView]; 

Usaría una subclase UIViewController que contiene una “Vista de contenedor” que incrusta a los demás controladores de vista. Luego podrá agregar el controlador de navegación dentro de la Vista de contenedor (usando la transición de inserción de la relación, por ejemplo).

Consulte Implementación de un controlador de vista de contenedor

Tenga en cuenta que si desea agregar vista en pantalla completa, solo use el código siguiente

Agregue estas extensiones de UIViewController

 public extension UIViewController { internal func makeViewAsFullScreen() { var viewFrame:CGRect = self.view.frame if viewFrame.origin.y > 0 || viewFrame.origin.x > 0 { self.view.frame = UIScreen.main.bounds } } } 

Continuar como proceso de adición normal de subvista

Ahora use al agregar viewDidAppear de UIViewController

 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) self.makeViewAsFullScreen() } 
 UIApplication.shared.keyWindow?.insertSubview(yourView, at: 1) 

Este método funciona con xcode 9.4, iOS 11.4

 [self.navigationController.navigationBar.layer setZPosition:-0.1]; UIView *view = [[UIView alloc]initWithFrame:CGRectMake(10, 20, 35, 35)]; [view setBackgroundColor:[UIColor redColor]]; [self.navigationController.view addSubview:view]; [self.navigationController.view bringSubviewToFront:view]; self.navigationController.view.clipsToBounds = NO; [self.navigationController.navigationBar.layer setZPosition:0.0]; 

enter image description here