2014-12-08 12 views
28

Sto tentando di utilizzare UIPopoverPresentationController per visualizzare un popover che non occupa l'intero schermo. Ho seguito molti tutorial diversi senza fortuna.UIPopoverPresentationController che visualizza popover come schermo intero

Ecco il mio codice. Installa correttamente lo ViewController, ma occupa l'intero schermo invece di uno schermo più piccolo come definito in preferredContentSize.

func showPopover() { 
    let vc = self.storyboard?.instantiateViewControllerWithIdentifier("PopupTimePickerViewController") as PopupTimePickerViewController 
    vc.modalPresentationStyle = .Popover 
    vc.preferredContentSize = CGSizeMake(200, 100) 

    if let presentationController = vc.popoverPresentationController { 
     presentationController.delegate = self 
     presentationController.permittedArrowDirections = .Up 
     presentationController.sourceView = self.view 
     presentationController.sourceRect = CGRectMake(0, 0, 50, 50) 

     self.presentViewController(vc, animated: true, completion: nil) 
    } 
} 

aggiornamento 9/27/16 con risposta corretta

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { 
    return .none 
} 
+0

Avete provato su iPhone? – gabbler

+0

@gabbler No. Solo sul simulatore. Non avere un iPhone per testarlo. –

+0

Sul simulatore di iPhone? – gabbler

risposta

29

In iPhone, si dovrebbe aggiungere il seguente al fine di presentare un popover.

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle { 
    // Return no adaptive presentation style, use default presentation behaviour 
    return .None 
} 
+0

Grazie. Questo l'ha risolto! Questo dovrebbe funzionare allo stesso modo anche per le dimensioni dell'iPad giusto? –

+2

Sì, compatibile con iPad. – gabbler

+1

Dove lo aggiungi? Per il controller di visualizzazione del Popover? – Noah

13

Per Swift3/IOS10, sembra che dobbiamo fare qualche cosa come

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

Aggiungendo questa risposta, nel caso in cui, qualcuno corre in questo problema come ho fatto durante la migrazione a swift3/IOS10

+0

fa questo lavoro anche in ios 9? – Eddie

+0

@Eddie non l'ho provato. Ho avuto principalmente problemi durante la migrazione a swift3. –

1

La risposta accettata è corretta. Per completezza, vedere Adapting Presented View Controllers to a New Style nella documentazione di Apple:

utilizzare il metodo del delegato adaptivePresentationStyleForPresentationController: per specificare uno stile di presentazione diversa da quella predefinita. Quando si passa a un ambiente compatto, gli unici stili supportati sono i due stili a schermo intero o UIModalPresentationNone. Il ritorno UIModalPresentationNone indica al controller di presentazione di ignorare l'ambiente compatto e continuare a utilizzare lo stile di presentazione precedente. Nel caso di un popover, ignorare la modifica ti dà lo stesso comportamento del popover di iPad su tutti i dispositivi.

Assicurarsi che le configurazioni richieste dal Presenting a View Controller in a Popover sono soddisfatte:

Dopo aver impostato lo stile di presentazione modal [del controller della vista presentato] per UIModalPresentationPopover, configurare i seguenti attributi popover correlati:

  • Impostare la proprietà preferredContentSize del controller di visualizzazione sulla dimensione desiderata.
  • Impostare il punto di ancoraggio del popover utilizzando l'oggetto UIPopoverPresentationController associato, accessibile dalla proprietà del controller di visualizzazione popoverPresentationController.
  • impostare solo uno dei seguenti modi:
    • Impostare la proprietà barButtonItem a un elemento pulsante della barra.
    • Impostare le proprietà sourceView e sourceRect in una regione specifica in una delle visualizzazioni.
Problemi correlati