2010-05-28 13 views
16

Ho un UIPopoverController con una sottoclasse UINavigationController. Sia le visualizzazioni genitore che quella figlio sono UITableviews.UIPopoverController w/UINavigationController Subview contentSizeForViewInPopover non funziona su Parent

Quando chiamo parent view originariamente con contentSizeForViewInPopover = (320.480) funziona alla grande.

Quando clicco nella vista bambino ridimensiono il popover per contentSizeForViewInPopover = (320.780)

Quando ritorno a vista primaria non posso ottenere il popover per ridimensionare di nuovo a contentSizeForViewInPopover = (320.480). il popover rimane nella dimensione (320.780).

State provando tutto ma mancava solo qualcosa. Qualcuno sa come ridimensionare la vista con UIPopoverControllers nello scenario sopra?

Grazie in anticipo !!

+0

qualcuno? Non ho ancora potuto ridimensionare correttamente il mio popover. è facile aumentare di dimensioni ma non riesco a farlo tornare alla dimensione originale più piccola. – Abbacore

+0

Un buon tagging è il modo per ottenere risposta alla tua domanda :) – skaffman

risposta

13

Ho avuto lo stesso problema, ma nessuna delle soluzioni di cui sopra ha funzionato per me. Tuttavia, nel tentativo di combinare i loro approcci, sono stato ispirato a provare un modo leggermente diverso di attaccare il problema. Questo funziona per me:

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    viewController.contentSizeForViewInPopover = navigationController.topViewController.view.frame.size; 
} 

Ho tre diversi popover che utilizzano entrambi i controller di navigazione. Questa soluzione ha il piacevole effetto collaterale di funzionare per tutti loro perché non fa un riferimento specifico a nessuno dei controller popover, ma finisce con l'utilizzo di popoverContentSize dal controller popover attualmente in uso.

+0

Dopo aver provato tutti i metodi in questo thread e da altri posti, questo è stato l'unico modo per far funzionare tutto questo. Grazie. –

+0

Ho trovato questo nella documentazione: "Questa proprietà contiene le dimensioni desiderate per il controller di visualizzazione quando viene visualizzato in un popover. Per impostazione predefinita, la larghezza è impostata su 320 punti e l'altezza è impostata su 1100 punti." Quindi se NON impostare il contentSizeForViewInPopover in modo esplicito, sarà 320x1100, questo mi stava facendo impazzire perché pensavo che Apple avrebbe usato le impostazioni predefinite sane e rendere contentSizeForViewInPopover predefinito per il frame della vista o qualcosa del genere, ma a quanto pare questo non è il caso. Quindi imposta contentSizeForViewinPopover se vuoi che il tuo popover si comporti! – mgrandi

+0

Questo ha funzionato anche per me, ma non ho idea del perché. le dimensioni dei popover sembrano disturbate. A volte si ridimensionano correttamente, altre volte è necessario impostare una strana serie di metodi solo per farlo funzionare correttamente. – LightningStryk

1

Penso di avere avuto lo stesso problema e l'ho risolto impostando la dimensione per la visualizzazione nel popover ogni volta che la vista stava per apparire. Come questo:

 

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

    self.contentSizeForViewInPopover = CGSizeMake(320, 444); //Set your own size 
} 

Spero che questo ti aiuti.

+0

grazie per l'input di enrigue. originariamente ho provato questo e proprio non sembra fare nulla. immagina, il popover genitore si apre a 320x480. quindi seleziono una riga che spinge una vista "figlio" all'interno del popover che è 320x720. se clicco sul pulsante Indietro la mia vista "genitore" è ancora 320x720. – Abbacore

+0

È possibile rilevare quando si preme il pulsante Indietro o quando la vista precedente viene visualizzata nuovamente dopo aver toccato il pulsante Indietro? Se riesci a rilevarlo, puoi inserire "contentSizeForViewInPopover" in quella parte del codice. –

24

La proprietà contentSizeForViewInPopover del controller di visualizzazione imposta solo la dimensione (iniziale) predefinita del relativo contenuto UIPopoverController. Per ridimensionare UIPopoverController in un momento arbitrario, è necessario impostare la proprietà popoverContentSize. Si noti che popoverContentSize è una proprietà di UIPopoverController e non del controller di visualizzazione (quindi è probabile che sia necessario un riferimento al controller popover in giro).

Per ripristinare le dimensioni del popover ogni volta che un controller di vista diventa la vista del regolatore superiore di una UINavigationController, è possibile utilizzare i metodi UINavigationControllerDelegate protocollo:

navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if (viewController == viewControllerToResize) { 
     referenceToUIPopoverController.popoverContentSize = CGSizeMake(320,480); 
    } 
} 
+0

Un possibile trucchetto è che se il contentSizeForViewInPopover di UIViewController non è stato impostato e si imposta popoverContentSize di UIPopoverController, verrà visualizzata prima la dimensione del popover sul popoverContentSize specificato, quindi sulla dimensione predefinita (attualmente 320x1100). Per risolvere questo, ho appena impostato contentSizeForViewInPopover e poi popoverContentSize. Disclaimer: questa non è una ricerca ben studiata; piuttosto solo quello che ho vissuto nel mio attuale progetto su iOS 4.3. – kalperin

+0

Questo ha funzionato per me dopo aver provato per ore a farlo bene, ma ho dovuto aggiungere un ritardo extra prima di ridimensionare effettivamente il popover. – XCool

2

Nel mio progetto ho dovuto cambiare dinamicamente la dimensione del popover.

ho fatto il delegato controller originale del mio controller contenuti popover, e attuate metodo delegato di essa la che viene chiamato ogni volta che il formato è cambiato:

Il codice è a soffietto, Speranza che aiuta qualcuno:

-(void) popover:(UIViewController*)controller didChangeSize:(CGSize)size{ 

    if ([controller class] == [AZViewController class]){ 
     if (!_popoverController){ 
      _popoverController = [[UIPopoverController alloc] initWithContentViewController:controller]; 
     } 

     _popoverController.popoverContentSize = size; 
    } 
} 
1

Penso che potrei aver capito come ho lottato con questo problema per un po 'di tempo. Potrebbe essere un po 'ottimista quindi non esitate a commentare se questa soluzione non funziona per voi.

In ciascuna viewController visualizzata con la gerarchia di navigazione, impostare la proprietà contentSizeForViewInPopover nel parametro viewDidAppear: metodo alla dimensione appropriata.

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self setContentSizeForViewInPopover:CGSizeMake(320, 320)]; 
} 

Un'altra cosa che ho preso è che quando si tocca di nuovo durante la modifica di un textField, la dimensione rimane piccola al posto del più grande vista precedente. Chiama il metodo resignFirstResponder sul tuo campo di testo nella vista del controller, WillDisDisplay.

Sono curioso di sapere se questa soluzione funziona su sdks.

+0

non funziona per me. SDK 6, compilazione per iOS 4.3 – SpaceDog

0

Dopo aver provato molte cose, la risposta di @ chuck-k mi ha aiutato a risolvere decentemente il mio problema con il popover di UINavigationController in iOS7.

Ecco quello che ho fatto:

  • per ogni UIViewController all'interno del UINavigationController a calcolare le dimensioni contenuti che desidera visualizzare nella metodo più - (CGSize)contentSizeForViewInPopovernavigationController.navigationBar.frame.size.height (che è sempre 44 credo). Non uso altre funzionalità di popover in questi UIViewControllers.

  • ho dichiarato la mia UIViewController che crea l'UINavigationController come UINavigationControllerDelegate

  • Poi nel delegato ....

.....

- (void)navigationController:(UINavigationController *)navigationController willShowViewController: (UIViewController *)viewController animated:(BOOL)animated { 

    BOOL popoverAnimation = NO; 

    if (self.myPopoverController.popoverContentSize.height < viewController.contentSizeForViewInPopover.height) popoverAnimation = YES; 

    [self.myPopoverController setPopoverContentSize:viewController.contentSizeForViewInPopover animated:popoverAnimation]; 
} 

L'altezza verifica il confronto tra la dimensione del contenuto del popover del controller di visualizzazione corrente e la dimensione del contenuto del popover del controller di visualizzazione "in entrata". Io uso l'animazione = NO passando da una dimensione più grande -> più piccola popover, perché altrimenti ottengo qualche animazione di riposizionamento a scatti in iOS7. Ma particolarmente se animazione = NO quando si passa da un più piccola -> più grande popover la dimensione del contenuto, il popover dimensioni aumenterebbe la dimensione che mi aspettavo, ma non visualizzerebbe contenuti più grande della precedenza più piccolo dimensione del contenuto ... impostazione animazione = SI risolto questo problema per me. (Controllo solo l'altezza perché nel mio caso la larghezza è fissa.)

Utilizzando questa tecnica quasi tutto funziona finalmente per la mia soddisfazione e spero che questo possa aiutare qualcun altro.

Problemi correlati