Domanda

Ho un popover contenente un UINavigationController. Posso visualizzare la multa popover, e contiene il bene navController. Il navController contiene una tableView e quando seleziono un elemento crea una nuova vista di dettaglio:

     DeviceDetailViewController *detailViewController = 
[[[DeviceDetailViewController alloc] initWithNibName:@"DeviceDetailViewController" bundle:nil] autorelease];

Ho poi spingo il nuovo controller della vista:

    [self.navigationController pushViewController:detailViewController animated:YES];

Questo è quando si verifica il problema:. dopo spingendo la nuova vista le ridimensiona popover per l'altezza massima disponibile sul iPad

Ho provato a fissare l'altezza di tutte le viste del XI ter altezza fissa piuttosto che flessibile. Ho provato a fissare in modo esplicito l'altezza del popover. Ho anche provato ad utilizzare diversi controller di vista come la vista del bambino. I resti. Problema: il popover vuole per ridimensionare stesso per altezza massima automaticamente ogni volta che un nuovo punto di vista è spinto al controller di navigazione

Ecco una domanda che discute cercando di controllare deliberatamente la dimensione del popover quando spingendo nuovi punti di vista:

Ho pensato che questo potrebbe essere un metodo forza bruta per controllare la dimensione. Stranamente, però, è in realtà fa sì che alcune peculiarità grafiche veloci (come se la vista venisse fresco animata in) seguito continuando a ridimensionare come descritto sopra.

In altre parole, qualcosa è letteralmente costringendo il popover alla sua massima altezza, e sembra che si verifichi dopo tutti i metodi delegato sono stati chiamati.

E 'il controller di navigazione? Qualcuno ha visto questo genere di cose?

È stato utile?

Soluzione

Questa fisso per me dopo che ho avuto lo stesso problema (per coincidenza anche oggi):

Modifica :. Come contentSizeForViewInPopover è deprecato in iOS7.0 così uso preferredContentSize

risposta originale al di sotto :

Nel vostro detailViewController aggiungere questo:

- (void)viewWillAppear:(BOOL)animated {

    CGSize size = CGSizeMake(320, 480); // size of view in popover
    self.contentSizeForViewInPopover = size;

    [super viewWillAppear:animated];

}

Anche voi volete aggiungere qualcosa di simile al vostro DeviceDetailViewController originale, per impedire il ridimensionamento quando si tocca la parte posteriore NavbarItem.

Altri suggerimenti

Un po 'come la gestione in viewWillAppear, un altro modo per affrontare questo è di ignorare contentSizeForViewInPopover. Molto laconico:

-(CGSize)contentSizeForViewInPopover
{
    return self.view.bounds.size;
}

Per IOS5

vi consiglio di farlo in:

- (void)viewDidLoad {
    [super viewDidLoad];

    CGSize size = CGSizeMake(320, 480); // size of view in popover
    self.contentSizeForViewInPopover = size;

}

Ho avuto un problema simile.

Ho avuto un popover presente da un pulsante in una barra degli strumenti. La popover è stato impostato su una dimensione specifica. E 'stata una vista tabella. Quando è stata selezionata la riga della tabella, un nuovo controller vista con un controller di navigazione è stato chiamato.

Quando è stato selezionato il pulsante Indietro, il popover è diventato la dimensione predefinita (320x1100 credo), al posto della dimensione specifica che desideravo.

Il codice originale era:

  MyTableViewController *myVC = [[MyTableViewController alloc] init];
  UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myVC];

  UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navController];
  popover.delegate = self;

  popover.popoverContentSize = CGSizeMake(400.0, 500.0);

  [myVC release];
  [navController release];
  [popover release];

Ho aggiunto una linea per risolvere il problema. Concesso è una specie di lavoro in giro perché ho dovuto sottrarre l'altezza dell'intestazione. Forse uno di voi mi potrebbe illuminare con un metodo migliore. In ogni caso, funziona.

  MyTableViewController *myVC = [[MyTableViewController alloc] init];

  UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myVC];

  UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navController];
  popover.delegate = self;

  popover.popoverContentSize = CGSizeMake(400.0, 500.0);

  //Subtract the height of the header to match the total popover size (not just the view).
  myVC.contentSizeForViewInPopover = CGSizeMake(400.0, 500-44);

  [myVC release];
  [navController release];
  [popover release];

Credo che quando un controller nav è coinvolta, e viene premuto il pulsante indietro, fa sì che il popover di default per le dimensioni predefinite. Aggiungendo la proprietà contentSizeForViewInPopover per il controller della vista myVC, costringe il formato specifico.

Spero che questo è utile.

Kurt

Per iOS 7 utilizzare il seguente:

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGSize size = CGSizeMake(320, 768); // size of view in popover
    self.preferredContentSize = size;
}

UIViewController.contentSizeForViewInPopover è stato sconsigliato prima in iOS 7.

In risposta a problemi grafici con le animazioni:

L'UIPopoverController animazioni conflitto con le animazioni controllori UINavigation, se si crea il popover con un UINavigationController al suo interno. Essa si traduce in difetti grafici quando si anima. Per risolvere il problema, il parametro animato impostato su false quando si spinge altri controllori, o quando si visualizza la barra degli strumenti.

Pushing View Controller:

[self.navigationController pushViewController:detailViewController animated:NO];

Rendere la barra degli strumenti visibile:

[[self navigationController] setToolbarHidden:NO animated:NO]; 

Impostazione della animato:. NO farà le animazioni sembrano corretti in un UIPopoverController

Perché non solo impostare il contentSizeForViewInPopover prima di spingere il regolatore successivo nello stack di navigazione? Non c'è bisogno di dimensioni set in viewWillAppear e così via.

[nextController setContentSizeForViewInPopover:[self contentSizeForViewInPopover]];
[[self navigationController] pushViewController:nextController animated:YES];

Opere su IOS 5.1

Lieve variante su consiglio di borked (!, Che mi ha segnalato nella giusta direzione, grazie per questo), ecco quello che faccio quando si spinge un nuovo controller per mantenere le dimensioni prima di spingerla:

productViewController.contentSizeForViewInPopover = self.view.bounds.size;
self.contentSizeForViewInPopover = self.view.bounds.size;

[self.navigationController pushViewController:productViewController animated:YES];

Mi piace questo perché non c'è bisogno di hardcode i valori popover in ogni controller della vista (bene da quando li uso a varie altezze).

La linea self.contentSizeForViewInPopover è quello di preservare la dimensione quando l'utente preme Indietro . Credo che si potrebbe mettere questa linea da qualche altra parte, come viewWillAppear o dove volete.

sembra funzionare ...

Nel - (void) viewDidLoad di tutti i controller di vista si sta utilizzando nella navigazione scrivere il codice:

self setContentSizeForViewInPopover:CGSizeMake(320, 500)];

Ci sono due modi per impostare la contentSizeForViewInPopover nello storyboard. È possibile impostare la visualizzazione controller che sono con il controller di navigazione, per FreeForm e impostare il punto di vista di root per le dimensioni desiderate. In alternativa, è possibile mantenere la metrica simulato come si evince e controllare "Usa dimensione esplicita" e impostare le dimensioni desiderate lì.

Poi, in ogni controller della vista che è dentro il controller di navigazione, aggiungere il seguente ...

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

     ["yourpopoverController" setPopoverContentSize:CGSizeMake(self.
           contentSizeForViewInPopover.width, seld.contentSizeForViewInPopover.height + self.
           navigationController.navigationBar.frame.size.height) animated:YES];
}

Nel animazione di transizione, la nuova vista verrà nel allineata con la parte superiore, e quindi l'altezza viene regolata di conseguenza.

In questo modo, non è necessario eseguire l'override contentSizeForViewInPopover, o specificare certo altro formato specificamente nei tuoi controller di vista. E 'tutto nello storyboard.

Se uno dei vostri controller di vista è regolabile in altezza, quindi si ha bisogno di sovrascrivere contentSizeForViewInPopover in quella vista in questo modo ...

- (CGSize)contentSizeForViewInPopover {
    return CGSizeMake(450, "calculate your height here");
}

Questa roba può aver lavorato una volta, ma non con Xcode 6 in cui contentSizeForViewInPopover è deprecato. Per fortuna è rispettata al momento del caricamento storyboard. Ho scaricato un editor XML (Xmplify) e fatto lo storyboard. Impostare la contentSizeForViewInPopover chiave per le dimensioni desiderate. Salvare e sostituire (fare una copia prima) storyboard.

In particolare:

< viewController>

     <value key="contentSizeForViewInPopover" type="size" width="450" height="280" / >

</viewController>

Non lavoro per me, quando uso questo:

[UIPopoverController 
    [UINavigationController] = root vc = [UIViewController vc1] => [UIViewController vc2] 
]
  

Quando appare popover è tutto buono, premere il pulsante sul VC1 e VC2 spinta alla navigazione del controller

     

successivo ritorno al VC1 (root) premendo il pulsante a VC2 (metodo popToRootViewController);

     

Si può vedere che il cambiamento popover proprio formato, ma la dimensione VC1 è vecchio ... CHE COSA È QUESTO ???

Ok, ora il lavoro ... Aggiungi proprietà popover nel mio controller

self.contentSizeForViewInPopover = (CGSize){400, 200};
self.navigationController.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
self.popover.popoverContentSize = self.contentSizeForViewInPopover;

Esecuzione Swift 4 e iOS 11 l'unica soluzione possibile era per me. Per utilizzare al posto di showViewController:sender: and showDetailViewController:sender: presentViewController:animated:completion:.

Da Apple Doc

  

Lo showViewController: mittente: e showDetailViewController: Mittente: metodi offrono il modo più adattivo e flessibile per controller di vista del display. Questi metodi consentono il controller della vista che presenta decidere il modo migliore per gestire la presentazione. Ad esempio, un controller della vista contenitore potrebbe includere il controllore vista come un bambino invece di presentarlo modale. I regali il comportamento predefinito del controller di vista modale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top