Estoy tratando de presentar un controlador de vista modalmente, con un fondo transparente. Mi objetivo es permitir que tanto la vista de los controladores de presentación como la vista presentada se muestren al mismo tiempo. El problema es que, cuando finaliza la animación de presentación, la vista del controlador de vista de presentación desaparece.
- (IBAction)pushModalViewControllerButtonPressed:(id)sender
{
ModalViewController *modalVC = [[ModalViewController alloc] init];
[self presentViewController:modalVC animated:YES completion:nil];
}
Sé que podría agregar la vista como una subvista, pero me gustaría evitar esta solución por alguna razón. ¿Cómo podría arreglarlo?
Respuestas:
El siguiente código solo funciona en el iPad.
Me gustaría agregar una vista secundaria.
Aquí hay una muy buena discusión. Mira los comentarios específicamente. No solo la respuesta.
Vista modal
Si yo fuera tú, no lo haría. Agregaría una vista secundaria y lo haría. Parece darme un mejor control sobre las cosas.
EDITAR:
Como mencionó Paul Linsay, desde iOS 8 todo lo que se necesita es
UIModalPresentationOverFullScreen
para el modalPresentationStyle del ViewController que se presenta. Esto también cubriría los botones navigationBar y tabBar.fuente
modalPresentationStyle = UIModalPresentationCurrentContext
de la presentadora controlador de vista, y no en el presentado uno.ViewController
de su vista. (por ejemplo, aNavigationController
o la instancia de su controlador de vista de menú deslizante, por ejemplo).UIModalPresentationCustom
, y solo si se establece justo antes enpresentViewController
lugar de hacerlo enviewDidLoad
.modalPresentationStyle
antesviewDidLoad
. Lo hice en el constructor y funcionó.Para aquellos que intentan que esto funcione en iOS 8, la forma "aprobada por Apple" de mostrar un controlador de vista modal transparente es configurando
modalPresentationStyle
el controlador ed actual enUIModalPresentationOverCurrentContext
.Esto se puede hacer en código o configurando las propiedades de la secuencia en el guión gráfico.
De la documentación de UIViewController:
https://developer.apple.com/documentation/uikit/uiviewcontroller
El video 'View Controller Advancements in iOS 8' de WWDC 2014 entra en esto con cierto detalle.
Nota:
viewDidLoad
del PresentViewController no tendrá ningún efectofuente
sourceVC
esself.navigationController
. Además, solo después de configurar el estilo de presentación de destino como personalizado, pude ver a través de él.[sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];
,[targetVC setModalPresentationStyle:UIModalPresentationCustom];
Es de esperar que ayude a alguien.presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContext
en la presentación de VC. No funciona en el presentado CV. Confía en mí, lo intenté.En iOS 8.0 y superior se puede hacer estableciendo la propiedad modalPresentationStyle en UIModalPresentationOverCurrentContext
fuente
.custom
y.overFullScreen
funciona..overFullScreen
el controlador de vista actualviewWillAppear
no se llamará.presentedController.view.backgroundColor = #color#
debe escribirse enpresentedController
'sviewDidLoad
, o de lo contrariopresentedController
la vida se interrumpe.Este código funciona bien en iPhone con iOS6 e iOS7:
En este caso, se pierde la animación deslizante. Para conservar la animación, aún puede usar la siguiente extensión "no elegante":
Si nuestro presentador V está ubicado dentro de UINavigationController o UITabbarController, debe operar con esos controladores como presentando VC.
Además, en iOS7 puede implementar un
UIViewControllerTransitioningDelegate
protocolo de aplicación de animación de transición personalizada . Por supuesto, en este caso puedes obtener un fondo transparentePrimero, antes de presentar debes configurar
modalPresentationStyle
Entonces tienes que implementar dos métodos de protocolo
Lo último es definir tu transición personalizada en
CustomAnimatedTransitioning
clasefuente
modalPresentationStyle
también de que esté configurado!Luché un poco con el Creador de interfaces de XCode 7 para establecer el Estilo de presentación como sugirió @VenuGopalTewari. En esta versión, no parece haber ninguna
Over Current Context
oOver Full Screen
modo de presentación para el segue. Por lo tanto, para que funcione, configuré el modo enDefault
:con
Además, configuré el modo de presentación del controlador de vista presentado modalmente en
Over Full Screen
:fuente
Cree un segue para presentar modalmente y establezca la propiedad Presentation de ese segue en el contexto actual funcionará al 100%
fuente
PresentViewController con fondo transparente: en iOS 8 e iOS 9
Y en MYViewController establece el color de fondo negro y reduce la opacidad
fuente
Es un poco hacky, pero para mí este código funciona (iOS 6):
Este código también funciona en iPhone
fuente
Esta categoría funcionó para mí (ios 7, 8 y 9)
Archivo H
Archivo M
fuente
La solución a esta respuesta usando swift sería la siguiente.
fuente
Si está utilizando Storyboard, puede seguir este paso:
fuente
Agregué estas tres líneas en el método init en el controlador de vista presentado, y funciona de maravilla:
EDITAR (trabajando en iOS 9.3):
Según la documentación:
Disponible en iOS 8.0 y posterior.
fuente
Una forma alternativa es usar una "vista de contenedor". Simplemente haga alfa por debajo de 1 e incruste con la secuencia. XCode 5, objetivo iOS7. Probado en iPhone.
Vista de contenedor disponible desde iOS6. Enlace a la publicación de blog sobre eso.
fuente
He creado un objeto para manejar la presentación de lo que yo llamo un "modal superpuesto", lo que significa que retiene la vista del fondo y le permite tener un modal con un fondo transparente.
Tiene un método único y simple que hace esto:
Es importante establecer la
modalPresentationCapturesStatusBarAppearance
propiedadYES
y forzar la actualización de la apariencia de la barra de estado, si su controlador de vista presentado tiene un valor diferentepreferredStatusBarStyle
.Este objeto debe tener un
@property (assign, nonatommic) isPresenting
¿Quieres este objeto de cumplir con las
UIViewControllerAnimatedTransitioning
y losUIViewControllerTransitioningDelegate
protocolos e implementar los métodos siguientes:y:
Esto hace una animación de deslizamiento desde abajo que imita la animación modal predeterminada, pero puedes hacer lo que quieras.
Lo importante es que la vista del controlador de vista de presentación permanecerá en la parte posterior, permitiéndole crear un efecto transparente.
Esta solución funciona para iOS 7+
fuente
Una forma muy simple de hacer esto (usando
Storyboards
, por ejemplo) es:Esto presentará una
UIViewController
formaStoryboard
modal, pero con un fondo translúcido.fuente
Trabajando para iOS 7-10
fuente
Para recapitular todas las buenas respuestas y comentarios aquí y seguir teniendo una animación mientras te mueves a la nueva,
ViewController
esto es lo que hice: (Compatible con iOS 6 y superior)Si está utilizando un
UINavigationController
\UITabBarController
este es el camino a seguir:Si lo haces, perderás tu
modalTransitionStyle
animación. Para resolverlo, puede agregar fácilmente a suSomeViewController
clase esto:fuente
Por supuesto, debe configurar UIModalPresentationCurrentContext, ¡pero el lugar para establecer clearColor también es muy importante! ¡No puede establecer el fondo en la función viewDidLoad, configúrelo antes de que la vista se cargue como en el controlador de vista raíz o en la función init del controlador que se presentará!
o
fuente
Si está utilizando modal segue, asegúrese de configurarlo como esta imagen (puede desactivar la animación si lo desea)
fuente
Un método completo probado en iOS 7 y iOS 8.
fuente
Swift 4.2
fuente
en appdelegate:
en su primer controlador de vista desde donde debe cargar la siguiente vista:
en su nextViewController que se agregará transparente:
fuente
Necesitamos configurar nuestro Modal correctamente.
objetivo de enlace de imagen
Primero, necesitamos cambiar el fondo de Vista del Controlador de Vista a Color claro. Simplemente significa que debe ser transparente. Por defecto, esa Vista es blanca.
En segundo lugar, debemos seleccionar el Segue que conduce a la pantalla de inicio de sesión y, en el Inspector de atributos, establecer la presentación en Contexto sobre actual. Esta opción solo está disponible con el diseño automático y las clases de tamaño habilitadas.
objetivo de enlace de imagen
fuente
Establecer la navegación
modalPresentationStyle
aUIModalPresentationCustom
y configure el color de fondo del controlador de vista presentado como color claro.
fuente