2012-03-15 16 views
5

Tengo un UIPopoverController con navigationController y muchas subvistas. El tamaño del popover se establece justo antes de mostrarse así:Cambiar contentSizeForViewInPopover en navigationController push en iOS

[self.myPopover setPopoverContentSize:CGSizeMake(320, 500)]; 

Eso funciona bien. El popover se muestra con un tamaño ajustado. Cuando se empuja otra vista en la navegación de la pila del tamaño de un popover se ajusta de nuevo - necesitará diferente altura - en el método viewWillAppear:

self.contentSizeForViewInPopover = CGSizeMake(320, 700); 

Esto también funciona bien. Cuando regreso a una vista anterior, el tamaño no cambia.

Agregué la misma llamada en viewWillAppear en la primera vista pero la vista no cambia de tamaño.

¿Cómo puedo gestionar el cambio de tamaño de popover cuando se navega entre las vistas?

Respuesta

3

Yo uso este truco:

- (CGSize)contentSizeForViewInPopover 
{ 
    return CGSizeMake(320, 200); 
} 

- (void) forcePopoverSize 
{ 
    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover; 
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, 
              currentSetSizeForPopover.height - 1.0f); 
    self.contentSizeForViewInPopover = fakeMomentarySize; 
} 


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

    [self forcePopoverSize]; 
} 

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

    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover; 
    self.contentSizeForViewInPopover = currentSetSizeForPopover; 
} 
+1

http://stackoverflow.com/questions/2752394/popover-with-embedded-navigation-controller-doesnt-respect-size-on-back-nav – Injectios

+0

Lamentablemente no funciona. –

+1

Este tipo funciona: http://stackoverflow.com/a/2946864/384864 –

3

Este es un asunto difícil. Intenté muchas cosas y finalmente conseguí que funcionara. También podría funcionar para ti.

En mi contentViewController guardo una referencia a UIPopoverController * parent;

Esta referencia se establece durante la inicialización de UIPopoverController y su contenido. Esto, por supuesto, podría no ajustarse directamente a su jerarquía de vistas. Código de UIViewController que muestra UIPopowerController es algo así como:

if (self.popoverController == nil) { 
    _contentController = [[ContentViewController alloc] initWithNibName:@"ContentViewController" 
                   bundle:[NSBundle mainBundle]]; 

    UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:_contentController]; 
    _contentController.parent = popover; 
    [popover setPopoverContentSize: CGSizeMake(520.0,580.0)]; 

    popover.delegate = self; 

    self.popoverController = popover; 
} 

Y cuando quiero cambiar dinámicamente el tamaño de contenido desde dentro contentViewController yo uso:

-(void)setNewSize:(CGSize) newSize { 

    [_parent setPopoverContentSize:newSize animated:YES]; 
} 
+0

No es una buena práctica llevar referencias. Todavía es una buena idea ... –

+1

@BorutTomazin: lo sé - en realidad es feo :) pero después de 8 horas de trabajo finalmente encontré una cosa que funcionó. Probablemente intentaré encontrar una solución más elegante para esta vez ... probablemente. Probaré el enlace que publicaste arriba. –

+1

Sí, lo sé. A veces es feo y funciona mejor que agradable y no funciona. :) Avíseme si encuentra una mejor solución. ¡Gracias! –

Cuestiones relacionadas