ios - Agregue un UIView sobre todo, incluso la barra de navegación
uiviewcontroller uinavigationbar (13)
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.. :)
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!
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.
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
Puede hacer eso agregando su vista directamente a la ventana clave:
UIView *myView = /* <- Your custom view */;
UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
[currentWindow addSubview:myView];
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!
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
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
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)
[self.navigationController.view addSubview:overlayView];
es lo que realmente quieres
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 sharedApplication].windows.lastObject addSubview:myView];
[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];