web-dev-qa-db-fra.com

Comment présenter un modal au sommet de la vue en cours dans Swift

(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)

enter image description here

Merci pour votre aide ... documentation ci-dessous:

enter image description here

26
kmiklas

Tout d’abord, supprimez tous les paramètres explicites du style de présentation modale dans le code et procédez comme suit:

  1. Dans le storyboard, définissez le style modalPresentation de ModalViewController sur Over Current context

img1

  1. Cochez les cases dans ViewController Root/Presenting - Provide Context et Define Context. Ils semblent travailler même sans contrôle.
42
Riskov

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)
16
Hardik Thakkar

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
13
Ivens Denner

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)
}
2
user7097242

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)
}
2
AceRam

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.

2
Tekla Keresztesi

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;)

1
Saqib Omer