Tengo un UIPopoverController que aloja un UINavigationController, que contiene una pequeña jerarquía de controladores de vista.
Seguí los documentos y para cada controlador de vista, configuré el tamaño del contexto de ventana emergente de la vista así:
[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];
(tamaño diferente para cada controlador)
Esto funciona como se esperaba mientras navego hacia adelante en la jerarquía: la ventana emergente anima automáticamente los cambios de tamaño para que se correspondan con el controlador empujado.
Sin embargo, cuando navego "Atrás" a través de la pila de vistas a través del botón Atrás de la barra de navegación, la ventana emergente no cambia de tamaño; permanece tan grande como la vista más profunda alcanzada. Esto me parece roto; Espero que la ventana emergente respete los tamaños que se configuran a medida que aparece en la pila de vistas.
¿Me estoy perdiendo de algo?
Gracias.
viewWillAppear:
)?Respuestas:
Ok, estaba luchando con el mismo problema. Ninguna de las soluciones anteriores me funcionó bastante bien, es por eso que decidí hacer una pequeña investigación y descubrir cómo funciona esto. Esto es lo que descubrí: - Cuando configura el
contentSizeForViewInPopover
en su controlador de vista, el popover no lo cambiará, aunque el tamaño del popover puede cambiar mientras se navega a un controlador diferente. - Cuando el tamaño del popover cambiará mientras navega a un controlador diferente, mientras retrocede, el tamaño del popover no se restaura - Cambiar el tamaño del popover en viewWillAppear da una animación muy extraña (cuando digamos que popController dentro del popover) - No lo recomendaría; para mí, configurar el tamaño codificado dentro del controlador no funcionaría en absoluto; mis controladores tienen que ser a veces grandes a veces pequeños; el controlador que los presentará tiene una idea sobre el tamañoUna solución para todo ese dolor es la siguiente: debe restablecer el tamaño de
currentSetSizeForPopover
en viewDidAppear. Pero debe tener cuidado, cuando establezca el mismo tamaño que ya se estableció en el campocurrentSetSizeForPopover
, el popover no cambiará el tamaño. Para que esto suceda, primero puede establecer el tamaño falso (que será diferente al que se estableció antes) y luego establecer el tamaño adecuado. Esta solución funcionará incluso si su controlador está anidado dentro del controlador de navegación y popover cambiará su tamaño en consecuencia cuando navegue de regreso entre los controladores.Puede crear fácilmente una categoría en UIViewController con el siguiente método de ayuda que haría el truco al establecer el tamaño:
Luego, invocalo en el
-viewDidAppear
controlador deseado.fuente
Así es como lo resolví para iOS 7 y 8:
En iOS 8, iOS envuelve silenciosamente la vista que desea en la ventana emergente en el presentViewController del controlador de vista PresentationViewController. Hay un video de la WWDC de 2014 que explica qué hay de nuevo con el controlador de popover donde tocan esto.
De todos modos, para los controladores de vista presentados en la pila de controladores de navegación que quieren su propio tamaño, estos controladores de vista necesitan (en iOS 8) llamar a este código para establecer dinámicamente el tamaño de contenido preferido:
Reemplace heightOfTable con su tabla calculada o altura de vista.
Para evitar una gran cantidad de código duplicado y crear una solución común de iOS 7 y iOS 8, creé una categoría en UITableViewController para realizar este trabajo cuando se llama a viewDidAppear en mis vistas de tabla:
Categoría.h:
Categoría.m:
fuente
presentingViewController
funciona. Si fijo elpreferredContentSize
deviewDidLoad
que hay un comportamiento extraño: Navegando hacia atrás desde otro controlador de vista en las derivaciones popover a un cambio de tamaño popover mal. Parece que se estableció un tamaño de popover de cero, pero el tamaño es correcto. En tal caso, el popover ocupa toda la altura de la pantalla. ¿Sabes quizás por qué es así? No tengo implementada la restricción con 600 puntos porque, en mi experiencia, el sistema operativo no te permite especificar un tamaño superior al tamaño de la pantalla.viewDidLoad
...Esta es una mejora en la respuesta de krasnyk .
Su solución es excelente, pero no está animada sin problemas.
Una pequeña mejora proporciona una animación agradable:
elimine la última línea del
- (void) forcePopoverSize
método:Ponga [self forcePopoverSize] en el
- (void)viewWillAppear:(BOOL)animated
método:Y finalmente, establezca el tamaño deseado en el
- (void)viewDidAppear:(BOOL)animated
método:fuente
Debe volver a establecer el tamaño del contenido en
viewWillAppear
. Llamando al método delagate en el que estableces el tamaño de popovercontroller. También tuve el mismo problema. Pero cuando agregué esto, el problema se resolvió.Una cosa más: si está utilizando versiones beta inferiores a 5. Entonces los popovers son más difíciles de administrar. Parecen ser más amigables desde la versión beta 5. Es bueno que la versión final esté disponible. ;)Espero que esto ayude.
fuente
viewWillAppear
no funcionó para mí. Establecer el tamaño del popover explícitamente funcionó, pero eso es un gueto.En el
-(void)viewDidLoad
de todos los controladores de vista que está utilizando en el controlador de navegación, agregue:fuente
Restablecí el tamaño en el método animado viewWillDisappear: (BOOL) del controlador de vista que se está navegando desde:
Luego, cuando aparece la vista a la que se está navegando, restablezco el tamaño de manera apropiada:
fuente
Para iOS 8 funciona lo siguiente:
Por cierto, creo que esto debería ser compatible con versiones anteriores de iOS ...
fuente
willTransitionToTraitCollection
, en elanimateAlongsideTransition
bloque de finalización.fuente
Para mí, esta solución funciona. Este es un método de mi controlador de vista que extiende UITableViewController y es el controlador raíz para UINavigationController.
Y no olvide configurar el tamaño del contenido para el controlador de vista que va a insertar en la pila de navegación
fuente
si puedes imaginar al asaltante, creo que esto es un poco mejor:
fuente
CGSizeZero
lugar de hacerlo usted mismo enCGSizeMake(0,0)
La respuesta aceptada no funciona bien con iOS 8. Lo que hice fue crear mi propia subclase de
UINavigationController
para usar en ese popover y anular el métodopreferredContentSize
de esta manera:Además, en lugar de llamar
forcePopoverSize
(método implementado por @krasnyk) enviewDidAppear
, decidí establecer un viewController (que muestra popover) como delegado para la navegación mencionada anteriormente (en popover) y hacer (lo que hace el método force) en:método delegado para una pasada
viewController
. Una cosa importante, hacerforcePopoverSize
en unUINavigationControllerDelegate
método está bien si no necesita que la animación sea fluida, si es así, déjelaviewDidAppear
.fuente
Estaba enfrentando el mismo problema, pero no desea establecer el tamaño del contenido en el método viewWillAppear o viewWillDisappear.
establecer la propiedad contentSizeForViewInPopover para ese controlador antes de enviar ese controlador a navigationController
fuente
Tuve suerte al poner lo siguiente en viewdidappear:
Aunque esto puede no animarse bien en el caso de empujar / hacer estallar popovers de diferentes tamaños. Pero en mi caso, ¡funciona perfectamente!
fuente
Todo lo que tienes que hacer es:
-En el método viewWillAppear de popOvers contentView, agregue el fragmento que se proporciona a continuación. Tendrá que especificar el tamaño del popOver la primera vez que se cargue.
fuente
Tuve este problema con un controlador popover cuyo popoverContentSize = CGSizeMake (320, 600) al principio, pero se agrandaría al navegar a través de su ContentViewController (un UINavigationController).
El controlador de navegación solo estaba presionando y haciendo estallar UITableViewControllers personalizados, por lo que en mi clase de controlador de vista de tabla personalizada viewDidLoad configuré self.contentSizeForViewInPopover = CGSizeMake (320, 556)
Los 44 píxeles menos son para dar cuenta de la barra de navegación del controlador Nav, y ahora ya no tengo ningún problema.
fuente
Pon esto en todos los controles de vista que estás empujando dentro del popover
fuente
Se enfrentó al mismo problema y lo solucionó configurando el tamaño de la vista de contenido en el controlador de navegación y el controlador de vista antes de que se colocara el inicio de UIPopoverController.
fuente
Solo me gustaría ofrecer otra solución, ya que ninguna de estas funcionó para mí ...
De hecho, lo estoy usando con este https://github.com/nicolaschengdev/WYPopoverController
Cuando llame por primera vez a su ventana emergente, use esto.
Luego, en esa ventana emergente, usa esto.
Luego repita para las vistas de los niños ...
fuente
Esta es la forma correcta en iOS7 de hacer esto, establezca el tamaño de contenido preferido en viewDidLoad en cada controlador de vista en la pila de navegación (solo se hace una vez). Luego, en viewWillAppear obtenga una referencia al controlador popover y actualice el contentSize allí.
fuente
La solución @krasnyk funcionó bien en versiones anteriores de iOS pero no en iOS8. La siguiente solución funcionó para mí.
No es la mejor solución, pero funciona.
El nuevo UIPopoverPresentationController también tiene el problema de cambio de tamaño :(.
fuente
Debe establecer la
preferredContentSize
propiedad del NavigationController enviewWillAppear
:fuente