2015-07-04 15 views
10

Nel mio progetto ho un pulsante in basso a destra dello schermo e ho aggiunto un altro controllore uiview allo storyboard, ho fatto il controllo-trascina sul controllore uiview che volevo come popover, quindi ho impostato la dimensione di viewcontroller su (300, 300) e controllato "usa la dimensione esplicita preferita". Quando carico l'app e faccio clic sul pulsante, l'intero schermo viene coperto dal "popover". Ho anche provato ad entrare nel file .m di popoverViewController e ho impostato la dimensione, ma non ha funzionato.
Qualche idea?Perché il passaggio "presenta come popover" copre l'intero schermo?

Modifica: Poiché sembra che debba essere a schermo intero, va bene, tuttavia sto ancora riscontrando alcuni altri problemi che avevo in precedenza. Verrà visualizzata la mia schermata popup e renderò lo sfondo nero e alfa come .5 per farcela vedere, tuttavia eseguirà l'animazione, quindi una volta terminata l'animazione lo schermo passerà da 0,5 opacità a completamente nero e l'unico la cosa che posso vedere è l'icona della batteria.

+0

provare a impostare il modalPresentationStyle sul ViewController destinazione UIModalPresentationPopover – Jef

+4

Stai provando con iPad o iPhone ? Popover non è per iphone. – Leo

+1

Oh sto provandolo su iphone. Come posso ottenere questo effetto su iPhone? – coal175

risposta

0

Su iPhone è possibile creare un controller di visualizzazione personalizzato in grado di gestire tutti i popover. Poiché ciascun controller di visualizzazione dispone di un proprio controller di navigazione, è possibile aggiungere un nuovo controller di visualizzazione a app.window.rootviewcontroller come a du view e portare tutto in primo piano.

Se non si desidera scrivere il proprio, si può usare qualcosa di simile, per esempio: http://cocoapods.org/pods/FPPopover

17

Il PO utilizza Objective-C. Questa risposta presenta il codice in modo rapido. Convertire swift in Objective-C dovrebbe essere facile.

In appena aggiunto ViewController, sotto “simulato Metriche” cambiamento “Dimensione” a “mano libera” e “Status Bar” su “Nessuno”.

In “simulato Size” cambiare l'altezza e la larghezza di immagine per la dimensioni reali desiderate che il contenuto del popover sia.

Creare un seguito al VC appena aggiunto. Usa il tipo di seguito come "Presente come popover" e dai un nome per il seguito, ad esempio "popoverSegue".

Nel ViewConroller da cui è necessario attivare questo seguito, aggiungere il protocollo UIPopoverPresentationControllerDelegate.

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate { 
} 

Ignora la funzione prepareForSegue per catturare il seguito del popover. Impostare il modalPresentationStyle per .Popover dichiarare esplicitamente che si vuole una popover e quindi assegnare la proprietà delegato del popoverPresentationController della vista di auto:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "popoverSegue" { 
      let popoverViewController = segue.destinationViewController as! UIViewController 
      popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover 
      popoverViewController.popoverPresentationController!.delegate = self 
     } 
    } 

implementare la funzione adaptivePresentationStyleForPresentationController di dire la vostra applicazione che si vuole veramente quella presentazione popover e accetterà sostituzioni:

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { 
     return UIModalPresentationStyle.None 
    } 

Seguendo questi, ho potuto ottenere un popup su iPhone, che non è a schermo intero, ma la dimensione impostata per il ViewController.

enter image description here

Fonte: iPad Style Popovers on the iPhone with Swift

+0

Questo funziona per me, ma trovo che il popover ignori le dimensioni della vista e mi dia una dimensione casuale pari a 1/3 della dimensione dello schermo. – SomeGuy

+0

Ah, risolto. Ho dovuto selezionare la casella "Usa dimensioni esplicite preferite" – SomeGuy

3

Swift 3 versione

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == SEGUE_IDENTIFIER { 
      let popoverViewController = segue.destination as! YourViewController 

      popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover 
      popoverViewController.popoverPresentationController!.delegate = self 
     } 
    } 

    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { 
     return UIModalPresentationStyle.none 
    } 
1

Grazie a Bharat for the great answer, Io personalmente uso un UIStoryboardSegue che fa più o meno la stessa cosa. In questo modo, posso cambiare la classe della segue nello storyboard, avere quello che voglio, e non inquinare le mie ViewControllers:

class AlwaysPopupSegue : UIStoryboardSegue, UIPopoverPresentationControllerDelegate 
{ 
    override init(identifier: String?, source: UIViewController, destination: UIViewController) 
    { 
     super.init(identifier: identifier, source: source, destination: destination) 
     destination.modalPresentationStyle = UIModalPresentationStyle.popover 
     destination.popoverPresentationController!.delegate = self 
    } 
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { 
     return UIModalPresentationStyle.none 
    } 
}