2015-09-22 12 views
7

Sto utilizzando UIPopoverPresentationController per i popover in un'app iOS. Quando un controller di navigazione in un popover spinge un nuovo controller di visualizzazione, il popover viene ridimensionato a preferredContentSize del controller di visualizzazione. Ma quando il controller di navigazione espelle un controller di visualizzazione dallo stack, il popover non viene ridimensionato alla dimensione precedente. Come posso farlo farlo?Come posso ridimensionare UIPopoverPresentationController sulla navigazione pop?

Possibile duplicato di this question, ma per il moderno UIPopoverPresentationController.

Aggiornamento: Vedere here ad esempio codice che illustra il problema. Clonalo e eseguilo in un simulatore di iPad. Tocca il pulsante Popover e ottieni un popover con un controller nav. Tocca l'elemento del pulsante della barra di spinta e ottieni un nuovo VC più alto nello stack (la dimensione è nella barra di navigazione). Pop e non ridimensionare di nuovo a quello che era.

risposta

15

Aggiungere questa riga:

self.navigationController.preferredContentSize = self.preferredContentSize; 

al metodo viewWillAppear:, in modo che sarà ora simile a questa:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    if (self.navigationController) 
    { 
     UIBarButtonItem *item = [[UIBarButtonItem alloc]initWithTitle:@"Push" style:UIBarButtonItemStylePlain target:self action:@selector(onPush)]; 
     self.navigationItem.rightBarButtonItem = item; 
     self.navigationItem.title = NSStringFromCGSize(self.preferredContentSize); 
     self.view.backgroundColor = [UIColor lightGrayColor]; 

     self.navigationController.preferredContentSize = self.preferredContentSize; 
    } 
} 

Si farà in modo che la dimensione preferita del controller di navigazione viene aggiornato ogni volta il controller della vista visualizzato cambia. L'ho provato sul tuo codice di esempio e ha risolto il problema.

+0

Bello. In realtà ho una sottoclasse di 'UINavigationController' che uso per risolvere [questo problema] (http://stackoverflow.com/questions/32697436/how-can-i-change-the-opacity-of-the-overlay-behind -uipopoverpresentationcontroll /), così ho annullato tutte le varianti di push e pop e applicato questo principio lì invece che in tutti i VC che posso avere nei controller nav nei popover. –

+0

Sei un maestro. – Claudio

3

Basta aggiungere nel codice successivo ViewController

- (void) viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    self.navigationController.preferredContentSize = CGSizeMake(200, self.parentViewController.childViewControllers.lastObject.preferredContentSize.height-100); 
} 

Ecco il video. Spero che questo sia un comportamento che ti aspetti di ottenere.

+0

Questo sembra promettente. Ma puoi renderlo generico, quindi non presumi la modifica della dimensione di +/- 100 punti? –

+0

@ Mr.Jefferson Cosa intendi promettendo? :) Hai scritto 'Pop e non si ridimensiona a quello che era. E ora puoi ridimensionarlo alla dimensione originale. E ho pensato che questo fosse solo un esempio da parte tua per illustrare il problema. E "renderlo generico" non è un compito chiaro :) Puoi fornire qualche formula o descrizione su come dovrebbe reagire il pop-over? Perché il problema non era nel generico ... :) –

+0

La tua risposta presuppone che il VC che stai spuntando sarà di 200 punti di larghezza e 100 punti più corto di quello da cui stai spuntando. Riesci a riscrivere la tua risposta per non dare per scontato che? –