guidelines - iOS-Controlador de vista modal semitransparente
tab bar ios (8)
¿Por qué no intentas configurar esto en AppDelegate?
self.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
luego cambiando el alfa en la vista que se presenta
Quiero presentar un controlador de vista con un fondo ligeramente transparente sobre la vista actual, de modo que la primera vista sea ligeramente visible debajo de la vista modal.
Establecí el valor alfa del controlador de vista modal y establecí el estilo modalPresentationStyle
en UIModalPresentationCurrentContext
, como se sugiere en otra publicación.
El resultado es que el fondo de la vista es transparente cuando se anima, pero cuando el controlador de vista está en su lugar, cambia a negro opaco. Vuelve a ser transparente mientras anima el despido.
¿Cómo puedo hacer que sea transparente cuando esté activo?
He probado en iOS 6 and 7
. El código que estoy usando sigue:
MyModalViewController *viewController = [[MyModalViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
[navController setNavigationBarHidden:YES];
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
[self.navigationController presentViewController:navController animated:YES completion:NULL];
Aquí hay una solución.
Cree su controlador de vista de presentación. Agregar una vista posterior a la vista principal de este controlador de vista. Nombre esto como backView
.
En SecondViewController.m
-(void)viewDidLoad
{
// Make the main view''s background clear, the second view''s background transparent.
self.view.backgroundColor = [UIColor clearColor];
UIView* backView = [[UIView alloc] initWithFrame:self.view.frame];
backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
[self.view addSubview:backView];
}
Ahora tienes un controlador de vista con medio fondo transparente. Puedes agregar lo que quieras a la self.view
, el resto será medio transparente.
Después de eso, en FirstViewController.m
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:secondViewController animated:YES completion:nil];
El mismo problema me ocurrió. Lo he resuelto observando la siguiente url sobre un controlador de alerta personalizado . Me las arreglé para hacerlo funcionar incluso con un UINavigationController
.
Swift 4
let viewController = UIViewController()
viewController.providesPresentationContextTransitionStyle = true
viewController.definesPresentationContext = true
viewController.modalPresentationStyle = .overCurrentContext
viewController.modalTransitionStyle = .crossDissolve
DispatchQueue.main.async {
self.navigationController?.present(viewController, animated: true, completion: nil)
}
La razón por la que los controladores de vista BG desaparecen después de que se muestra un modal es que la transición predeterminada en iOS 7 elimina la vista BG después de que se complete la animación. Si define su propia transición y configura su vista BG para que no se elimine (solo cambiando su alfa), tendrá la vista modal transparente.
Mi solución es la siguiente:
Cree una UIView transparente superpuesta personalizada que se muestre sobre cualquier vista, barra de navegación y barra de tabulación.
-En el controlador de navegación (o controlador de la barra de pestañas) en el que está integrado su controlador de vista, creo una vista personalizada con su marco igual al marco de la vista del controlador de navegación.
-Entonces lo puse fuera de la pantalla configurando su origen.y a navigationController.view.height
-Luego creo 2 funciones - (void) showOverlay y - (void) hideOverlay que animan la vista de superposición en la pantalla y fuera de ella:
- (void)hideOverlay{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3];
CGRect frm = self.helpView.frame;//helpView is my overlay
frm.origin.y = self.offscreenOffset; //this is an Y offscreen usually self.view.height
self.helpView.frame = frm;
[UIView commitAnimations];
}
- (void)showOverlay{
[self.view bringSubviewToFront:self.helpView];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3];
CGRect frm = self.helpView.frame;
frm.origin.y = self.onscreenOffset;
self.helpView.frame = frm;
[UIView commitAnimations];
}
-En mi controlador de vista solo puedo llamar
[(MyCustomNavCtrl *)self.navigationController showOverlay];
[(MyCustomNavCtrl *)self.navigationController hideOverlay];
Y eso es todo.
Para tu información: La sintaxis es ahora:
childVC.modalPresentationStyle = UIModalPresentationStyle.OverFullScreen
Si está apuntando a ios 8 y superior, puede configurar el estilo de presentación modal en "sobre el contexto actual" y listo. Si es ios 7 e inferior, tendría que crear un estilo de transición personalizado para que la pantalla de presentación no se quede en blanco después de la transición. Eso es bastante complicado.
La solución que presento ofrece mucha flexibilidad: haga una captura de pantalla antes de mostrar el diálogo modal y configúrela como la imagen de fondo para la ventana de la aplicación. Por defecto, el fondo es negro (eso es lo que ve cuando desaparece el controlador de vista posterior). Cambia el fondo a la captura de pantalla de la aplicación. Haga la captura de pantalla en el método viewWillAppear o viewDidLoad de su vista transparente. Esto funciona incluso con los segmentos de inserción, no solo los cuadros de diálogo modales, sino que debe evitar las animaciones. En general, evite las animaciones que afectan la posición de la vista de fondo, ya que harán que parezca que vuelve a encajar en su lugar cuando finaliza la transición. Es una buena idea restablecer el fondo a su imagen negra anterior en viewDidDissapear para evitar efectos no deseados.
Puede mantener una pila de dichas imágenes de fondo y puede hacer varias secuencias de inserción "transparentes". O tenga algún menú complejo / profundo que aparezca en la parte superior de la pantalla principal. Por estas muchas razones, creo que esta solución es mejor que rodar su propio código de transición. Es más flexible y más fácil de implementar, y usted no tiene que lidiar con las animaciones usted mismo.
iOS 8 agregó un nuevo estilo de presentación modal específicamente para este propósito:
presentedViewController.modalPresentationStyle = UIModalPresentationOverFullScreen
De la spec :
UIModalPresentationOverFullScreen
Un estilo de presentación de vista en el que la vista presentada cubre la pantalla. Las vistas que se encuentran debajo del contenido presentado no se eliminan de la jerarquía de vistas cuando finaliza la presentación. Entonces, si el controlador de vista presentado no llena la pantalla con contenido opaco, el contenido subyacente se muestra a través.