(Xcode6, iOS8, Swift, iPad)
J'essaie de créer une vue modale classique de type Web, où l'extérieur de la boîte de dialogue est "grisé". Pour ce faire, j'ai défini la valeur alpha de backgroundColor de la vue pour le modal sur 0,5, comme suit:
self.view.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5)
Le seul problème est que lorsque le modal devient plein écran, la présentation est supprimée. (Réf. vue modale transparente sur le contrôleur de navigation ).
(Un peu irrité par le concept ici. Pourquoi supprimer la vue sous-jacente? Un modal est, par définition, affiché au-dessus d'un autre contenu. Une fois la vue sous-jacente supprimée, ce n'est plus vraiment un modal. C'est quelque part entre un modal et un Push. wa wa wa ... en tout cas ..)
Pour éviter cela, j'ai défini modalPresentationStyle
sur CurrentContext
dans la méthode viewDidLoad
du contrôleur parent et dans Storyboard ... mais sans succès.
self.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
self.navigationController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
Comment empêcher la vue de présentation d'être supprimée lorsque le modal devient plein écran?
tyvm .. plus d'infos ci-dessous.
Aussi dans Storyboard, comme ça (Présentation: contexte actuel)
Merci pour votre aide ... documentation ci-dessous:
Tout d’abord, supprimez tous les paramètres explicites du style de présentation modale dans le code et procédez comme suit:
modalPresentation
de ModalViewController sur Over Current context
Provide Context
et Define Context
. Ils semblent travailler même sans contrôle.Vous pouvez essayer ce code pour 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)
Pour Swift 4 syntaxe la plus récente en utilisant l'extension
extension UIViewController {
func presentOnRoot(`with` viewController : UIViewController){
let navigationController = UINavigationController(rootViewController: viewController)
navigationController.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
self.present(navigationController, animated: false, completion: nil)
}
}
Comment utiliser
let popup : PopupVC = self.storyboard?.instantiateViewControllerWithIdentifier("PopupVC") as! PopupVC
self.presentOnRoot(with: popup)
Le seul problème que je peux voir dans votre code est que vous utilisez CurrentContext
au lieu de OverCurrentContext
.
Alors, remplacez ceci:
self.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
self.navigationController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
pour ça:
self.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
self.navigationController.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
La seule façon pour que cela fonctionne est de le faire sur le contrôleur de présentation:
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)
}
Cela a fonctionné pour moi dans Swift 5.0. Définissez l'Id Storyboard dans l'inspecteur d'identité en tant que "destinationVC".
@IBAction func buttonTapped(_ sender: Any) {
let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let destVC = storyboard.instantiateViewController(withIdentifier: "destinationVC") as! MyViewController
destVC.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
destVC.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
self.present(destVC, animated: true, completion: nil)
}
Le problème avec la définition de modalPresentationStyle à partir de code était que vous auriez dû le définir dans la méthode init () du contrôleur de vue présenté, et non dans le contrôleur de vue parent.
A partir de la documentation UIKit: "Définit le style de transition qui sera utilisé pour ce contrôleur de vue lorsqu'il sera présenté sous forme modale. Définissez cette propriété sur le contrôleur de vue pour qu'il soit présenté, et non pour le présentateur. Par défaut, UIModalTransitionStyleCoverVertical."
La méthode viewDidLoad ne sera appelée que si vous avez déjà présenté le contrôleur de vue.
Le deuxième problème est que vous devez utiliser UIModalPresentationStyle.overCurrentContext.
Je mets à jour une solution simple. Ajoutez d’abord un identifiant à votre séquence qui présente modal. Dans les propriétés, changez le style de présentation en "Contexte actuel". Ensuite, ajoutez ce code dans le contrôleur de présentation (le contrôleur qui présente 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
}
}
}
Assurez-vous de changer segue.identifier en votre propre identifiant;)