uinavigationcontroller - UIPopoverController cambia automáticamente el tamaño a la altura máxima en pushViewController
(13)
¿Por qué no simplemente establecer el contentSizeForViewInPopover
antes de presionar el siguiente controlador en la pila de navegación? No es necesario establecer tamaños en viewWillAppear
y tal.
[nextController setContentSizeForViewInPopover:[self contentSizeForViewInPopover]];
[[self navigationController] pushViewController:nextController animated:YES];
Funciona en IOS 5.1
Tengo un popover que contiene un UINavigationController. Puedo mostrar el popover bien, y contiene el navController muy bien. NavController contiene tableView y cuando selecciono un elemento crea una nueva vista de detalle:
DeviceDetailViewController *detailViewController =
[[[DeviceDetailViewController alloc] initWithNibName:@"DeviceDetailViewController" bundle:nil] autorelease];
Luego presiono el nuevo controlador de vista:
[self.navigationController pushViewController:detailViewController animated:YES];
Aquí es cuando ocurre el problema: después de pulsar la nueva vista, el popover cambia el tamaño a la altura máxima disponible en el iPad.
He intentado establecer la altura de todas las vistas en el xib a una altura fija en lugar de flexible. Intenté establecer explícitamente la altura del popover. También intenté usar diferentes controladores de vista como vista infantil. El problema persiste: el popover quiere cambiar el tamaño de la altura máxima automáticamente cada vez que se envía una nueva vista al controlador de navegación.
Aquí hay una question que trata de tratar de controlar deliberadamente el tamaño del popover al impulsar nuevas vistas:
Pensé que este podría ser un método de fuerza bruta para controlar el tamaño. Sin embargo, por extraño que parezca, en realidad causa algunos caprichos gráficos rápidos (como si la vista estuviese siendo animada recientemente) seguido de continuar cambiando el tamaño como se describió anteriormente.
En otras palabras, algo está literalmente forzando al popover a su altura máxima, y parece ocurrir después de que se hayan llamado todos los métodos de delegado.
¿Es el controlador de navegación? ¿Alguien ha visto este tipo de cosas?
Al ejecutar Swift 4 y iOS 11, la única solución posible fue para mí. Para usar showViewController:sender: and showDetailViewController:sender:
lugar de presentViewController:animated:completion:
Del Apple Doc
Los métodos showViewController: sender: y showDetailViewController: sender: ofrecen la manera más flexible y adaptable de mostrar los controladores de visualización. Estos métodos permiten que el controlador de vista de presentación decida la mejor manera de manejar la presentación. Por ejemplo, un controlador de vista de contenedor podría incorporar el controlador de vista como un elemento secundario en lugar de presentarlo de manera modal. El comportamiento predeterminado presenta el controlador de vista de forma modal.
Al igual que manejarlo en viewWillAppear
, otra forma de lidiar con esto es anular contentSizeForViewInPopover
. Muy escueto
-(CGSize)contentSizeForViewInPopover
{
return self.view.bounds.size;
}
En el - (void) viewDidLoad de todos los controles de vista que está utilizando en la navegación, escriba el código:
self setContentSizeForViewInPopover:CGSizeMake(320, 500)];
En respuesta a fallas gráficas con animaciones:
Las animaciones UIPopoverController entran en conflicto con las animaciones de los controladores UINavigation, si crea el popover con un UINavigationController dentro de él. Resulta en fallas gráficas al animar. Para solucionar el problema, configure el parámetro animado en falso cuando presione otros controladores o cuando muestre la barra de herramientas.
Empujar los controladores de vista:
[self.navigationController pushViewController:detailViewController animated:NO];
Hacer que la barra de herramientas sea visible:
[[self navigationController] setToolbarHidden:NO animated:NO];
Configuración de la animación: NO hará que las animaciones se vean correctas en un UIPopoverController.
Esto lo solucionó después de que tuve el mismo problema (coincidentemente también hoy):
EDITAR : Como contentSizeForViewInPopover
está en desuso en iOS7.0
use preferredContentSize
.
Respuesta original a continuación :
En su detailViewController
agregue esto:
- (void)viewWillAppear:(BOOL)animated {
CGSize size = CGSizeMake(320, 480); // size of view in popover
self.contentSizeForViewInPopover = size;
[super viewWillAppear:animated];
}
También desea agregar algo similar a su DeviceDetailViewController original para evitar el cambio de tamaño al tocar el elemento NavbarItem de vuelta.
Esto puede haber funcionado una vez pero no con xCode 6 en donde contentSizeForViewInPopover está en desuso. Afortunadamente, se respeta en el tiempo de carga del guión gráfico. Descargué un editor xml (Xmplify) y pirateé el guión gráfico. Establezca la clave contentSizeForViewInPopover en el tamaño que desee. Guarde y reemplace (haga una copia primero) del guión gráfico.
Más específicamente :
< viewController>
<value key="contentSizeForViewInPopover" type="size" width="450" height="280" / >
</viewController>
Hay dos formas de establecer contentSizeForViewInPopover en el guión gráfico. Puede configurar los controladores de vista que están con su controlador de navegación en FreeForm y establecer las vistas de la raíz al tamaño deseado. O bien, puede mantener la métrica simulada como inferida y marcar "Usar tamaño explícito" y establecer el tamaño que desea allí.
Luego, en cada controlador de vista que está dentro de su controlador de navegación, agregue lo siguiente ...
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
["yourpopoverController" setPopoverContentSize:CGSizeMake(self.
contentSizeForViewInPopover.width, seld.contentSizeForViewInPopover.height + self.
navigationController.navigationBar.frame.size.height) animated:YES];
}
En la animación de transición, la nueva vista se alineará con la parte superior, y luego la altura se ajustará en consecuencia.
De esta forma, no tiene que anular contentSizeForViewInPopover, o especificar algún otro tamaño específicamente en sus controladores de vista. Todo está en el guión gráfico.
Si uno de tus controladores de vista tiene una altura variable, entonces necesitas anular contentSizeForViewInPopover en esa vista así ...
- (CGSize)contentSizeForViewInPopover {
return CGSizeMake(450, "calculate your height here");
}
Leve varient en el consejo de borked (que me indicó la dirección correcta, ¡gracias por eso!), Esto es lo que hago al presionar un nuevo controlador para mantener el tamaño antes de empujarlo:
productViewController.contentSizeForViewInPopover = self.view.bounds.size;
self.contentSizeForViewInPopover = self.view.bounds.size;
[self.navigationController pushViewController:productViewController animated:YES];
Me gusta esto porque no tengo que codificar los valores de popover en cada controlador de vista (bueno, ya que los utilizo en varias alturas).
La línea self.contentSizeForViewInPopover
es para preservar el tamaño cuando el usuario self.contentSizeForViewInPopover
. Supongo que podrías poner esta línea en otro lugar, como viewWillAppear
o donde quieras.
Parece funcionar...
No trabaje para mí, cuando uso esto:
[UIPopoverController
[UINavigationController] = root vc = [UIViewController vc1] => [UIViewController vc2]
]
Cuando aparezca el popover está bien, presione el botón en vc1 y presione vc2 en el controlador de navegación
A continuación, vuelva a vc1 (raíz) presionando el botón en vc2 (método popToRootViewController);
Podemos ver que el popover cambia de tamaño, pero el tamaño vc1 es viejo ... ¿QUÉ ES ESTO?
Ok, ahora trabaja ... Agrega la propiedad popover en mi controlador
self.contentSizeForViewInPopover = (CGSize){400, 200};
self.navigationController.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
self.popover.popoverContentSize = self.contentSizeForViewInPopover;
Para IOS5
Te recomiendo que lo hagas en:
- (void)viewDidLoad {
[super viewDidLoad];
CGSize size = CGSizeMake(320, 480); // size of view in popover
self.contentSizeForViewInPopover = size;
}
Para iOS 7 usa lo siguiente:
- (void)viewDidLoad
{
[super viewDidLoad];
CGSize size = CGSizeMake(320, 768); // size of view in popover
self.preferredContentSize = size;
}
UIViewController.contentSizeForViewInPopover
ha quedado en desuso en primer lugar en iOS 7.
Tuve un problema similar.
Tenía un presente de popover desde un botón en una barra de herramientas. El popover se estableció en un tamaño específico. Fue una vista de tabla. Cuando se seleccionó la fila de la tabla, se llamó a un nuevo controlador de vista con un controlador de navegación.
Cuando se seleccionó el botón Atrás, el popover se convirtió en el tamaño predeterminado (320x1100, creo), en lugar del tamaño específico que yo deseaba.
El código original 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];
Agregué una línea para resolver el problema. De acuerdo, es una especie de solución porque tuve que restar la altura del encabezado. Tal vez alguno de ustedes podría iluminarme con un método mejor. De todos modos, funciona.
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];
Creo que cuando se utiliza un controlador de navegación, y se presiona el botón Atrás, hace que el popover adopte su tamaño predeterminado por defecto. Al agregar la propiedad contentSizeForViewInPopover para el controlador de vista myVC, fuerza el tamaño específico.
Espero que esto sea útil.
Kurt