Comment présenter un modal au sommet de la vision actuelle de Swift

(Xcode6, iOS8, Swift, iPad)

j'essaie de créer une vue modale Web-like classique, où l'extérieur de la boîte de dialogue est" grisé-out."Pour ce faire, j'ai mis la valeur alpha du bruit de fond de la couleur de la vue pour le modal à 0.5, comme ceci:

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

le seul problème est que lorsque le modal devient plein écran, la vue de présentation est supprimée. (Ref 1519100920" Transparent Modal Vue sur la manette de Navigation ).

(un peu irrité par le concept ici. Pourquoi supprimer la vue sous-jacente? Un modal est, par définition, d'apparaître au sommet d'un autre contenu. Une fois la vue sous-jacente retirée, ce n'est plus vraiment un modal. c'est quelque part entre une transition modale et une transition push. Wa wa wa... De toute façon..)

pour éviter cela, j'ai réglé le modalPresentationStyle sur CurrentContext dans la méthode viewDidLoad du contrôleur parent, et dans le Storyboard... mais pas de chance.

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

Comment puis-je empêcher la vue de présentation d'être retirée lorsque le modal devient plein écran?

tyvm.. plus d'infos ci-dessous.

aussi dans Storyboard, comme so (présentation: contexte actuel)

enter image description here

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

enter image description here

24
demandé sur Community 2014-06-21 01:51:44

6 réponses

tout d'abord, supprimer tous les paramètres explicites du style de présentation modale dans le code et faire ce qui suit:

  1. dans le storyboard jeu Le Modalviewcontroller's modalPresentation style à Over Current context

img1

  1. vérifiez les cases à cocher dans les ViewController Root/Presenting - Provide Context et Define Context . Ils semblent être au travail, même pas cochée.
37
répondu Riskov 2017-10-20 21:54:41

le seul problème que je vois dans votre code est que vous utilisez CurrentContext au lieu de OverCurrentContext .

remplacer ce qui suit:

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

pour ceci:

self.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
self.navigationController.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
12
répondu Ivens Denner 2015-07-25 16:55:25

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)
9
répondu Hardik Thakkar 2016-05-03 13:14:35

je mets à jour une solution simple. Ajoutez d'abord un id à votre séquence qui présente modal. Que dans les propriétés changer son style de présentation à "Contexte Actuel". Que d'ajouter ce code dans le contrôleur de vue 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


        }
    }
}

changez la séquence.identifiant de votre propre id ;)

1
répondu Saqib Omer 2015-01-15 04:51:28

le problème avec le réglage du modalPresentationStyle à partir du code était que vous auriez dû le régler dans la méthode init() du contrôleur de vue présenté, pas dans le contrôleur de vue parent.

de UIKit docs: "définit le style de transition qui sera utilisé pour ce contrôleur de vue lorsqu'il est présenté de manière modulaire. Définir cette propriété sur le contrôleur de vue à présenter, pas le présentateur. Par défaut Uimodaltransitionstylecovertical."

la méthode viewDidLoad ne sera appelée qu'après que vous ayez déjà présenté le contrôleur de vue.

le deuxième problème était que vous devriez utiliser UIModalPresentationStyle.overCurrentContext.

1
répondu Tekla Keresztesi 2016-12-25 19:39:09

le seul moyen que j'ai trouvé pour que cela fonctionne était de le faire sur le contrôleur de la vue 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)
}
1
répondu user7097242 2018-02-10 21:48:11