2016-05-19 11 views
15

Ho problemi a cambiare la dimensione della mia presentazione popover. Ecco quello che ho finoraCome cambiare la dimensione di un popover

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) // func for popover 
{ 
    if segue.identifier == "popoverView" 
    { 
     let vc = segue.destinationViewController 

     let controller = vc.popoverPresentationController 

     if controller != nil 
     { 
      controller?.delegate = self 
      controller?.sourceView = self.view 
      controller?.sourceRect = CGRect(x:CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds),width: 315,height: 230) 
      controller?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0) 
     } 
    } 
} 

Finora tutto questo non fa altro che il centro popover e rimuovere la freccia, che è buono. ma non ridimensiona il contenitore. Qualsiasi aiuto sarebbe molto apprezzato. grazie.

quando uso preferredContentSize ottengo l'errore "non può assegnare alla proprietà: 'preferredContentSize' è immutabile"

+0

Perché non si presenta come un foglio modulo modale invece di provare a utilizzare un popover in un modo che non è destinato? – Wain

+0

Possibile duplicato di [Come aggiusto il mio popover alle dimensioni del contenuto nella mia vista tabella in swift?] (Http://stackoverflow.com/questions/29449998/how-do-i-adjust-my-popover-to -il-size-of-the-content-in-my-tableview-in-swift) –

+0

scusate, non ho specificato. Questo sarà per iPhone. secondo Apple, non è possibile ridimensionare un foglio di modulo modale su iPhone ma è possibile su un iPad. A meno che non abbia letto quello sbagliato. inoltre, ho provato diversi modi per ridimensionare il popover ma nulla sembra funzionare. Sono sicuro che esiste una semplice soluzione per il codice che ho fornito. Non l'ho ancora trovato. – icestorm0806

risposta

37

Impostare il formato contenuto preferito sul controller della vista non essendo presentato il popoverPresentationController

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) // func for popover 
    { 
     if segue.identifier == "popoverView" 
     { 
      let vc = segue.destinationViewController 

      vc.preferredContentSize = CGSize(width: 200, height: 300) 

      let controller = vc.popoverPresentationController 

      controller?.delegate = self 
      //you could set the following in your storyboard 
      controller?.sourceView = self.view 
      controller?.sourceRect = CGRect(x:CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds),width: 315,height: 230) 
      controller?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0) 

     } 
    } 
5

I risolto tramite storyboard: Fare clic sul controller Fare clic su Attribute inspector ViewController> Selezionare Usa dimensioni e valori di input espliciti preferenziali. Check Image

+1

Sebbene questo possa teoricamente rispondere alla domanda, [sarebbe preferibile] (// meta.stackoverflow.com/q/8259) per includere qui le parti essenziali della risposta e fornire il link per riferimento. – GhostCat

0

Non sto usando gli storyboard. Ho presento un UINavigationController nella popover:

self.present(popoverNavigationController!, animated: true) {} 

Il modo di aumentare le dimensioni popover quando un nuovo controller di vista è spinto, è basta cambiare la preferredContentSize prima di spingerlo. Ad esempio:

Il problema si verifica quando si tenta di ridimensionare il popover quando si apre un controller di visualizzazione.

Se si utilizza viewWillDisappear del controller di visualizzazione corrente per modificare il preferredContentSize del popover, il popover verrà ridimensionato ma dopo che il controller di visualizzazione è spuntato. Ciò significa che l'animazione ha un ritardo.

È necessario modificare preferredContentSize prima di eseguire popViewController. Ciò significa che devi creare un pulsante Indietro personalizzato nella barra di navigazione come viene spiegato here. Questa è l'implementazione aggiornato per Swift 4:

 self.navigationItem.hidesBackButton = true 
     let newBackButton = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(CurrentViewController.backButtonTapped(sender:)))  
     self.navigationItem.leftBarButtonItem = newBackButton 

ed eseguire il codice seguente, quando viene premuto il nuovo pulsante Indietro:

@objc func backButtonTapped(sender: UIBarButtonItem) { 

     self.navigationController?.preferredContentSize = CGSize(width: 348, height: 200) 

     self.navigationController?.popViewController(animated: true) 
    } 

In sostanza, il preferredContentSize deve essere cambiato prima di spingere e schioccare la vista controller.