11

Voglio mostrare una vista - PresentedView su un'altra vista - Background View utilizzando iOS 7. Nella mia app, sto usando UITabBArController, quindi in fase di esecuzione non so quale vista sarebbe la vista di sfondo (potrebbe essere uno qualsiasi degli elementi della barra delle schede). Qui di seguito è la struttura:UIModalPresentationStyle.CurrentContext Swift iOS 7

UITabBarController 
    ---> TabItem1 - FirstUIViewController 
    ---> TabItem2 - SecondUIViewController 
    ---> TabItem3 - ThirdUIViewController 

bisogno di qualcosa come questo:

enter image description here

Quando carichi app, sono su TabItem1 - FirstUIViewController. Quando clicco su TabItem3, voglio che FirstUIViewController compaia in FirstUIViewController e "FirstUIViewController" dovrebbe apparire in background senza che l'interazione dell'utente sia abilitata.

Quello che ho fatto finora:

  1. Dal momento che, UIViewControllers sono aggiunti come Relationship Controllers apparire come TabBar Item in `UITabBarController, ho aggiunto un segue da tabbarcontroller a ThridViewController.

  2. Cambiato PresentationStyle per questo Segue a UIModalPresentationStyle.CurrentContext e ha fatto seguito la modifica

    func `viewDidLoad()` { 
        super.viewDidLoad() 
        self.performSegue("identifier", sender: self) 
    } 
    

Non succede nulla e mi basta vedere 'ThridViewController' con sfondo bianco

  1. Ho provato l'approccio di codifica manuale:

    func `viewDidLoad()` { 
        super.viewDidLoad() 
        let overlayController:UIThirdViewController = UIThirdViewController() //This controller has a view added on top of it, which covers top half screen only 
        overlayController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext 
        self.presentViewController(overlayController, animated: true, completion: nil) 
    } 
    

Nessun cambiamento. Nuova vista sovrascrive la vista precedente. se aggiungo questo overlayController.view.backgroundColor = UIColor.clearColor(), vedo la metà dello schermo nero e mezzo contenente la mia nuova vista

Problema Punti:

  1. Dove devo scrivere il codice per inizializzare/chiamare ThirdViewController a comparire in cima di vista corrente?
  2. Come risolvere il problema dello schermo nero e farlo funzionare su iOS 7?

Sto utilizzando Xcode 7 e in esecuzione su iOS7. Per favore aiuto. Sarà apprezzato lo snippet di codice di lavoro. Non inviare altri messaggi di overflow dello stack come risposta, a meno che il codice non funzioni & da te provato.

UPDATE: - Con questo approccio, ottengo uno schermo nero

class TabBarViewController: UITabBarController, UITabBarControllerDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.delegate = self 
    } 

    func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool { 

     let switchController:UIViewController = SwitchViewController() 

     self.presentingViewController?.modalPresentationStyle = UIModalPresentationStyle.CurrentContext 
     self.presentingViewController?.view.backgroundColor = UIColor.clearColor() 
     self.presentViewController(switchController, animated: true, completion: nil) 
     return false 
    } 
} 

risposta

3

Rendilo un controller di visualizzazione contenitore personalizzato (Apple Docs). Lavorare codice di esempio:

class MyTabVC: UITabBarController, UITabBarControllerDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.delegate = self 
    } 

    func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool { 
     presentThirdVC() 
     return false 
    } 

    func presentThirdVC() { 
     let myThirdVC = MyThirdVC.makeVC() 

     myThirdVC.view.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.1) 
     addChildViewController(myThirdVC) 
     var newFrame = CGRectInset(view.bounds, 0, 50) // hack, do what you want 
     myThirdVC.view.frame = newFrame 
     view.addSubview(myThirdVC.view) 
     didMoveToParentViewController(myThirdVC) 
    } 

} 

class MyThirdVC: UIViewController { 
    class func makeVC() -> MyThirdVC { 
     return UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("myThirdVC") as! MyThirdVC 
    } 
} 

Screenshot:

enter image description here

+0

Funziona su iOS 7? – Sategroup

+0

Sì, credo che queste API siano presenti da iOS 5, osservando il supporto della versione per addChildViewController. – bobics

4

Si dovrebbe sottoclasse UITabBarController e aggiungerlo il comportamento nella sottoclasse personalizzata.Impostare il delegato UITabBarController come self e quindi quando si tocca l'indice specifico invece di lasciarlo scambiare le schede si presenta modamente il menu. I metodi UITabBarControllerDelegate ti daranno la possibilità di farlo.

specifcally di utilizzare questo metodo delegato ....

- tabBarController:shouldSelectViewController: 

È possibile presentare il menu quando questo è chiamato per il quale mai scheda e tornare NO. Solo tu una visualizzazione vuotaController per questa scheda in quanto non verrà mai mostrata all'utente.

Per la transizione stessa, consigliamo vivamente di utilizzare una sottoclasse di UIPresentationController per impostare il riquadro di visualizzazione contenitore in modo che sia un po 'più piccolo della dimensione dello schermo e aggiungere un "dimmingView". Questo è disponibile solo su iOS8, quindi se vuoi iOS7 dovrai fare più cose da hacker.

+0

prego il mio ** UPDATE ** nella descrizione – Sategroup