present modal xcode ipad modal-dialog swift transparent

xcode - Cómo presentar un modal encima de la vista actual en Swift



swift present modal view controller programmatically (6)

(Xcode6, iOS8, Swift, iPad)

Intento crear una vista modal clásica similar a la Web, donde el exterior del cuadro de diálogo está "atenuado". Para lograr esto, he establecido el valor alfa del backgroundColor de la vista para el modal en 0.5, así:

self.view.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5)

El único problema es que cuando el modal se convierte en pantalla completa, se elimina la vista de presentación. (Ref. Modal View transparente en el controlador de navegación ).

(Un poco irritado por el concepto aquí. ¿Por qué eliminar la vista subyacente? Un modal es, por definición, para aparecer encima de otro contenido. Una vez que se elimina la vista subyacente, ya no es realmente un modal. Está en algún lugar entre un modal y un empujón transición. Wa wa wa ... De todos modos ...)

Para evitar que esto suceda, configuré el modalPresentationStyle en CurrentContext en el método viewDidLoad del controlador principal y en Storyboard ... pero no viewDidLoad suerte.

self.modalPresentationStyle = UIModalPresentationStyle.CurrentContext self.navigationController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext

¿Cómo evito que se elimine la vista de presentación cuando el modal se convierte en pantalla completa?

tyvm .. más información a continuación.

También en Storyboard, como tal (Presentación: contexto actual)

Gracias por su ayuda ... documentación a continuación:


El único problema que puedo ver en su código es que está utilizando CurrentContext lugar de OverCurrentContext .

Entonces, reemplace esto:

self.modalPresentationStyle = UIModalPresentationStyle.CurrentContext self.navigationController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext

para esto:

self.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext self.navigationController.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext


El problema al configurar el modalPresentationStyle del código era que debería haberlo configurado en el método init () del controlador de vista presentado, no en el controlador de vista padre.

Desde documentos de UIKit: "Define el estilo de transición que se usará para este controlador de vista cuando se presenta de manera modal. Establezca esta propiedad en el controlador de vista para presentarla, no el presentador. Se establece de manera predeterminada en UIModalTransitionStyleCoverVertical".

El método viewDidLoad solo se invocará después de que ya hayas presentado el controlador de vista.

El segundo problema fue que deberías usar UIModalPresentationStyle.overCurrentContext.


Estoy actualizando una solución simple. Primero agregue una identificación a su segue que presente modal. Que en las propiedades cambia su estilo de presentación a "Sobre el contexto actual". Luego agregue este código al presentar el controlador de vista (El controlador que presenta el modal).

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { let Device = UIDevice.currentDevice() let iosVersion = NSString(string: Device.systemVersion).doubleValue let iOS8 = iosVersion >= 8 let iOS7 = iosVersion >= 7 && iosVersion < 8 if((segue.identifier == "chatTable")){ if (iOS8){ } else { self.navigationController?.modalPresentationStyle = UIModalPresentationStyle.CurrentContext } } }

Asegúrese de cambiar segue.identifier a su propia identificación;)


La única forma en que puedo hacer que esto funcione es haciendo esto en el controlador de vista de presentación:

func didTapButton() { self.definesPresentationContext = true self.modalTransitionStyle = .crossDissolve let yourVC = self.storyboard?.instantiateViewController(withIdentifier: "YourViewController") as! YourViewController let navController = UINavigationController(rootViewController: yourVC) navController.modalPresentationStyle = .overCurrentContext navController.modalTransitionStyle = .crossDissolve self.present(navController, animated: true, completion: nil) }


Primero, elimine toda la configuración explícita del estilo de presentación modal en el código y haga lo siguiente:

  1. En el guión gráfico, establezca el estilo de modalPresentation modal de modalPresentation en el Over Current context
  1. Marque las casillas de verificación en Root / Presenting ViewController - Provide Context y Define Context . Parecen estar trabajando incluso sin control.

Puedes probar este código para Swift

let popup : PopupVC = self.storyboard?.instantiateViewControllerWithIdentifier("PopupVC") as! PopupVC let navigationController = UINavigationController(rootViewController: popup) navigationController.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext self.presentViewController(navigationController, animated: true, completion: nil)