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:
- En el guión gráfico, establezca el estilo de
modalPresentation
modal demodalPresentation
en elOver Current context
- Marque las casillas de verificación en Root / Presenting ViewController -
Provide Context
yDefine 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)