2014-06-20 7 views
23

(Xcode6, iOS 8, Swift, iPad)Come presentare una modale in cima la vista corrente in Swift

Sto cercando di creare una vista modale Web-come classico, in cui la parte esterna della finestra di dialogo è "in grigio -su." Per fare questo, ho impostato il valore alfa del backgroundColor della vista per il modal a 0,5, in questo modo:

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

L'unico problema è che quando il modal diventa a schermo intero, la vista presentazione è rimosso. (Rif. Transparent Modal View on Navigation Controller).

(Un po 'irritato al concetto qui, perché rimuovere la vista sottostante? Una modale è, per definizione, apparire sopra altri contenuti Una volta rimossa la vista sottostante, non è più una modale. modale e una transizione spinta. Wa wa wa ... comunque ..)

Per evitare che ciò accada, ho impostato il modalPresentationStyle-CurrentContext nel metodo del controller genitore viewDidLoad, e in Storyboard ... ma senza fortuna.

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

Come impedire che la vista di presentazione venga rimossa quando la modale diventa a schermo intero?

tyvm .. maggiori informazioni di seguito.

Anche in Storyboard, in questo modo (Presentazione: Contesto attuale)

enter image description here

Thx per il vostro aiuto ... documentazione di seguito:

enter image description here

risposta

36

In primo luogo, rimuovere tutte le impostazioni esplicite di stile di presentazione modale nel codice e fare quanto segue:

  1. Nel storyboard impostare modalPresentation lo stile del ModalViewController per Over Current context

img1

  1. Controllare le caselle di controllo nella Root/Presenting ViewController - Provide Context e Define Context. Sembra che stiano lavorando anche senza controllo.
+2

questo non ha funzionato FINO I "rimosso tutte le impostazioni esplicita di stile di presentazione modali" - che significa che se hai qualcosa come "vc.modalPresentationStyle = UIModalPresentationStyle.CurrentContext", devi rimuovere quel codice prima che le istruzioni dello storyboard abbiano effetto. –

+0

La tua app era un'app universale o solo per iPhone? Funziona solo con le app universali? – Crashalot

+2

Grazie mille, il controllo "Fornisci contesto" e "Definisci contesto" sul VC di presentazione ha funzionato. Suppongo che lo storyboard a volte definisca automaticamente il controller di visualizzazione come "contesto di fornitura", a volte no, a seconda di come è organizzata la gerarchia della vista. –

1

Sto aggiornando una soluzione semplice. Per prima cosa aggiungi un id al tuo seguito che presenta modale. Rispetto alle proprietà cambia il suo stile di presentazione in "Contesto attuale". Aggiungere questo codice nel presentare il controller della vista (il controller che presenta modale).

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 


     } 
    } 
} 

Assicurati di cambiare segue.identifier al tuo id;)

+0

Grazie per la soluzione. Ma in IOS7 il mio modale mantiene lo sfondo nero. Come sistemarlo? grazie –

+0

Stai presentando la vista da Segue? –

+0

Ottieni lo stesso problema. Schermo nero. Mostrando con un seguito –

12

L'unico problema che posso vedere nel codice è che si sta utilizzando CurrentContext invece di OverCurrentContext.

Quindi, sostituire questo:

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

per questo:

self.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext 
self.navigationController.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext 
+0

Questa opzione può essere utilizzata se iOS è iOS8 + – alicanbatur

8

Si può provare questo codice per 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) 
+0

Funziona! Puoi dirmi come funziona usando UINavigationController e perché non funziona senza usare UINavigationController? –

+0

@Anirudha Mahale: Per lavorare senza il controller di navigazione devi fare qualcosa di simile a questo: lascia popup: StickerCollectionVC = self.storyboard? .standardreViewController (withIdentifier: "StickerCollectionVC") as! StickerCollectionVC popup.stickerCollectionVCDelegate = self popup.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext self.present (popup, animato: true, completamento: nil) –

+0

* Puoi provare a spiegare il codice * – Andy

-1

Il problema con l'impostazione del modalPresentationStyle dal codice era che dovresti averlo impostato nel metodo init() o f il controller della vista presentato, non il controller della vista genitore.

Da docs UIKit: "Definisce lo stile di transizione che verrà utilizzato per questo controller di vista quando si è presentato in modo modale Impostare questa proprietà sul controller della vista da presentare, non il presentatore predefiniti per UIModalTransitionStyleCoverVertical..."

Il metodo viewDidLoad verrà chiamato solo dopo aver già presentato il controller di visualizzazione.

Il secondo problema era che dovresti usare UIModalPresentationStyle.overCurrentContext.

0

L'unico modo che ho in grado di farlo funzionare è stato in questo modo il controller della vista presentazione:

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