10

estoy tratando de modal presentar un controlador de vista, como a continuación:UIModalPresentationCurrentContext with Transition?

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"addPopover"]; 
vc.view.backgroundColor = [UIColor clearColor]; 
self.modalPresentationStyle = UIModalPresentationCurrentContext; 
[self presentModalViewController:vc animated:YES]; 

Ahora, utilizando UIModalPresentationCurrentContext significa que puedo presentar este punto de vista con un fondo transparente y ver mi otra vista detrás de la nueva. Sin embargo, me impide poder presentarlo con una transición.

¿Alguna idea de por qué? ¿O cómo puedo evitar esto? Gracias.

+0

¿Cuál es el estilo de presentación del ViewController que está presentando? – brynbodayle

+0

@bbodayle, estoy teniendo el mismo problema, y ​​probé todos los estilos de presentación/combinaciones en ambos ViewControllers. –

Respuesta

11

No se permite que los verbos en pantalla completa le permitan ver la capa inferior. Molesto lo sé.

De su código asumo que "addPopover" es en realidad una vista de pantalla completa, donde tiene su contenido como una subsección, mientras que el resto es transparente.

Prueba esto:

vc.modalPresentationStyle = UIModalPresentationCurrentContext; 
vc.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
[self presentViewController:vc animated:YES completion:NULL]; 

Nota: Me gustaría recomendar la adición de un color de fondo baja alfa para que el usuario sepa que no pueden interactuar con el resto de la vista cuando usted hace estallar este sobre la parte superior. ..

+1

¿Qué es diferente aquí? Establecer modalTransitionStyle en la vista de destino no hizo ninguna diferencia y tampoco lo hizo usando presentViewController sobre presentModalViewController. –

+0

asignando el estilo de transición a 'vc' en lugar de' self', y usando el método 'presentViewController'. Sin ver su guión gráfico es difícil diagnosticar si esto no funciona. Con el método anterior, su VC superpuesto debe ser del mismo tamaño que "propio" (o puede cambiar el tamaño) –

+2

Sí, en mi proyecto, ambos ViewControllers son del mismo tamaño. Probé tu código y no hubo cambios. La configuración de propiedad 'modalPresentationStyle = UIModalPresentationCurrentContext' debe aplicarse a self aquí, no a vc. Supongo que tendré que comenzar mi propia pregunta en lugar de ofrecer una recompensa por esta, porque no hay solución aquí, a pesar de que está marcado como uno. –

25

Pude lograr esto configurando modalPresentationStyle = UIModalPresentationCurrentContext en el RootViewController de mi UIWindow, SI no he presentado ningún nuevo ViewControllers de pantalla completa sobre este rootViewController. Hice algo como esto:

UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController; 
rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext; 
[self presentViewController:vc animated:YES completion:nil]; 

He intentado esto con tanto un UINavigationController como RootViewController de mi ventana y varios otros controladores de vista personalizada. Parece que mientras el control raíz de la ventana conozca lo que está sucediendo, cualquier subcontrol de vista puede llamar al presentViewController:animated:completion: sin oscurecer la vista subyacente.

Sin embargo, supongamos que presenta otra viewController en la parte superior del RootController de su ventana. Y este nuevo viewController se presenta con modalPresentationStyle = UIModalPresentationFullScreen (es decir, ocupa la pantalla), luego debe llamar al modalPresentationStyle = UIModalPresentationCurrentContext en ese viewController de la parte superior.

Así que para recapitular:

  • Si tiene UINavigationController -> UIViewController (s) (que podrían ser empujados y se metió dentro y fuera), a continuación, establecer modalPresentationStyle = UIModalPresentationCurrentContext en el UINavigationController.
  • Si tienes UINavigationController -> UIViewController -> new-UIViewController (con modalPresentationStyle configurado en UIModalPresentationFullScreen), configuras modalPresentationStyle = UIModalPresentationCurrentContext en el nuevo UIViewController.

¡Espero que esto también les sirva a ustedes! sugerencias

+1

Esto funcionó para mí. La clave era establecer el modalPresentationStyle en el controlador de vista de presentación, no el controlador de vista que se presenta. –

+0

¿Qué sucede si lo presenta en un UISplitViewController? –

+0

¡Gracias por esto! –

0

Sr. de T trabajaron casi perfectamente, que acaba de perder la animación de transición en los que se presentan viewcontroller

Dado que también está estableciendo el estilo de presentación de la appDelegates RootViewController, que también se eliminan las animaciones de transición para los puntos de vista presentados a partir de ese punto.

Mi solución era volver estilo de presentación de la AppDelegates RootViewController de nuevo a su forma predeterminada cada vez que el viewcontroller está cerrado que tenía el fondo transparente sobre

he un botón que descarta la presentedViewController, en el que yo también configurar la presentación estilo de rootViewController a su valor predeterminado usando:

UIViewController *rootViewController = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; 
    rootViewController.modalPresentationStyle = UIModalPresentationFullScreen; 

Espero que ayude a cualquier otra persona a perplejarse en este problema.