Tengo una ventana emergente que contiene un UINavigationController. Me puede mostrar la ventana emergente de la multa, y que contiene la navController bien. El navController contiene un formato tableview y al seleccionar un elemento se crea una nueva vista de detalle:

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

Yo, a continuación, empuje el nuevo controlador de vista:

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

Esto es cuando se produce el problema: después de empujando la nueva vista de la ventana emergente cambia el tamaño a la altura máxima disponible en el iPad.

He tratado de ajuste de la altura de todas las vistas en el xib a altura fija en vez de flexible. He tratado de establecer explícitamente la altura de la ventana emergente. También he probado con diferentes vistas de los controladores de el niño. El problema sigue siendo: la ventana emergente quiere tamaño máx altura de forma automática cada vez que un nuevo punto de vista es empujado a la navegación controlador.

Aquí un pregunta que describe tratando deliberadamente de control el tamaño de la ventana emergente cuando se empuja nuevos puntos de vista:

Pensé que esto podría ser un método de fuerza bruta para controlar el tamaño. Curiosamente, sin embargo, es en realidad la causa de que algunas rápida de gráficos peculiaridades (como si la vista se estaban recién animados), seguido por seguir para cambiar el tamaño de como se describió anteriormente.

En otras palabras, algo que es, literalmente, forzando la ventana emergente a su altura máxima, y parece ocurrir después de todos los métodos de delegado han sido llamados.

Es el controlador de navegación? Alguien ha visto este tipo de cosas?

InformationsquelleAutor SG1 | 2010-08-11

13 Comentarios

  1. 123

    Este fijo que es para mí, después de que yo tenía el mismo problema (coincidentemente también hoy):

    EDITAR : Como contentSizeForViewInPopover está en desuso en iOS7.0 para uso preferredContentSize.

    Respuesta Original a continuación:

    En su detailViewController añadir 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 la original DeviceDetailViewController para no cambiar el tamaño al tocar la parte de atrás NavbarItem.

    • Gracias! Yo tenía el mismo problema y UIViewController del contentSizeForViewInPopover atributo se corrigió.
    • Gracias, has salvado mi día 😀
    • Gracias , funciona como un encanto !
    • En al menos un caso, yo todavía tenía que establecer explícitamente el menú emergente de altura de la misma (si la ventana emergente controlador ya era visible con un definido por la altura). Pero por otro lado esta trabajado para volver a una página anterior en un controlador de navegación.
    • WOW! Esto fue difícil de encontrar. Muchas gracias. Esta es realmente una ayuda. Si uno era rotación de la vista controlador dentro de un popup manualmente, todos los empujó a la vista de los controladores se cambie su tamaño. El uso de esta solución hace que todo sea suave. Yo estaba buscando Días para una solución de este tipo.
    • Además se puede utilizar «auto.contentSizeForViewInPopover = auto.navigationController.vista.marco.tamaño;». A continuación, todos los niños de la vista de los controladores está utilizando el tamaño de la navegación controlador. Esto es útil si usted inicie la ventana emergente a través de programación. El tamaño de la navController se pueden establecer antes de que la ventana emergente se inicia y todas las subvistas hará uso de este tamaño.
    • Me gustó esa idea, no tener que codificar algunos números, pero (en mi caso) esto crece el cuadro de la altura de la barra de navegación por la transición. Por desgracia.
    • Esto no parece resolver por mí. Estoy empujando en un UITableViewController subclase, sin una punta. Voy a luchar un poco más de tiempo…
    • este es probablemente demasiado tarde, pero desde que me encontré con esto: añadir ese código para viewWillAppear sólo se aplica el efecto a mi punto de vista de los controladores después de que me girarlas o empujado/apareció desde mi navegación del controlador de la pila. Para obtener el tamaño inicial aplicado, también tuve que configurar la ventana emergente de la instancia popoverContentSize propiedad (así como la configuración de la contentSizeForViewInPopover en el navigationController sí mismo).
    • Sí, yo tengo trabajo, finalmente, y creo que terminé por hacer eso también. Gracias
    • Esto no funciona para mí, necesarios para poner en viewDidLoad, no viewWillAppear
    • Esto no está funcionando para mí, apareciendo un controlador de vista de no restaurar la altura de ese controlador pesar de que se restaure el ancho correcto para ese controlador. Por favor, ver a mi repo abierto, bitbucket.org/danielphillips/uipopovercontroller-resize-bug
    • si usted está usando navigationController interior de la ventana emergente y problema se produce incluso después de ajustar preferredContentSize. Tratar de [auto.parentPopOverController setPopoverContentSize:CGSizeMake(250, 400) animadas:YES]; antes de empujar la UIViewController

  2. 30

    Mucho como el manejo en viewWillAppear, otra manera de lidiar con esto es reemplazar contentSizeForViewInPopover. Muy breve:

    -(CGSize)contentSizeForViewInPopover
    {
        return self.view.bounds.size;
    }
    
    • Funciona con iOS5.hallan roto solución no parecen trabajar con ios5.
    • En mi caso, esto solo hizo que la ventana emergente el tamaño de la pantalla completa.
    • Maletic, que vista fue self.view en su caso? Acabo de probar de nuevo y todavía funciona.
    • ver el encabezado de la propiedad: contentSizeForViewInPopover le permite establecer el tamaño del contenido desde dentro de la vista del controlador. Esta propiedad es de lectura/escritura, y generalmente no debe reemplazar.
    • todavía el establecimiento de la propiedad en contentViewController viewWillAppear nunca trabajó para mí mientras reemplazar el captador de siempre.
    • Usted desea tomar el tamaño de la superview límites, no el de la vista.

  3. 30

    Para IOS5

    Os recomiendo que lo hagáis en:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        CGSize size = CGSizeMake(320, 480); //size of view in popover
        self.contentSizeForViewInPopover = size;
    
    }
    
    • Gracias. Me gustaría poder dar 5 votos 🙂
    • Esta debe ser la respuesta correcta
    • Esto no está funcionando para mí, apareciendo un controlador de vista de no restaurar la altura de ese controlador pesar de que se restaure el ancho correcto para ese controlador. Por favor, ver a mi repo abierto, bitbucket.org/danielphillips/uipopovercontroller-resize-bug
  4. 11

    Yo tenía un problema similar.

    Tenía una ventana emergente presente desde un botón en una barra de herramientas. La ventana emergente se establece un tamaño específico. Era una vista de tabla. Cuando la fila de la tabla fue seleccionado, un nuevo controlador de vista con un controlador de navegación fue llamado.

    Cuando la espalda se selecciona el botón, la ventana emergente se convirtió en el tamaño predeterminado (320×1100 creo), en lugar de tamaño específico que yo deseaba.

    El código original fue:

      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];
    

    He añadido una línea para resolver el problema. De hecho es una especie de evitar porque tenía que restar la altura de la cabecera. Tal vez uno de ustedes podría aclararme 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];
    

    Yo creo que cuando un nav controlador, y se pulsa el botón atrás, hace que la ventana emergente de forma predeterminada, su tamaño predeterminado. Mediante la adición de la contentSizeForViewInPopover de la propiedad para el controlador de vista de myVC, se obliga a que el tamaño específico.

    Espero que esto sea útil.

    Kurt

    • Gracias. Su sugerencia de que funciona para mí y el resto no.
    • Otras opciones no funcionan cuando he sustituido una vista existente controlador con una nueva en un ya cambia el tamaño ventana emergente controlador, esta opción no funcionó
  5. 9

    Para iOS 7, use la siguiente:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        CGSize size = CGSizeMake(320, 768); //size of view in popover
        self.preferredContentSize = size;
    }
    

    UIViewController.contentSizeForViewInPopover ha sido desaprobado primero en iOS 7.

  6. 6

    En respuesta a fallos gráficos con animaciones:

    La UIPopoverController animaciones en conflicto con la UINavigation controladores de animaciones, si crea la ventana emergente con un UINavigationController en su interior. Que se traduce en fallos gráficos cuando se mueven. Para solucionar el problema, establecer animados parámetro a false cuando empuja a los otros controladores, o cuando se muestra la barra de herramientas.

    Empujando A La Vista De Los Controladores:

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

    Hacer la Barra de herramientas visible:

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

    Configuración de la animación:NO va a hacer que las animaciones de buscar corregir en una UIPopoverController.

    • La animación de los conflictos entre UIPopoverController y [UINavigationController setToolbarHidden:animación:] era un problema que me estaba enfrentando. Buena sugerencia, ya que la corrección no es intuitiva. setToolbarHidden sin animación realmente mostrar/ocultar la barra de herramientas con la animación manejado por el UIPopoverController, como usted dice. Muy sutil pero a la vez molesto gotcha.
  7. 5

    ¿Por qué no acaba de establecer las contentSizeForViewInPopover antes de oprimir el siguiente controlador sobre la pila de navegación? No hay necesidad de ajustar los tamaños en viewWillAppear y tal.

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

    Funciona en IOS 5.1

    • Probablemente la mejor idea
    • contentSizeForViewInPopover está en desuso en iOS7, pero preferredContentSize trabajo así.
  8. 4

    Ligera variante en la hallan roto los consejos (que me señaló en la dirección correcta, gracias por eso!), he aquí lo que yo hago cuando empujar un nuevo controlador para mantener el tamaño antes de empuje:

    productViewController.contentSizeForViewInPopover = self.view.bounds.size;
    self.contentSizeForViewInPopover = self.view.bounds.size;
    
    [self.navigationController pushViewController:productViewController animated:YES];
    

    Me gusta porque no tengo que codificar la ventana emergente valores en cada controlador de vista (bueno desde que tengo uso de ellos en varias alturas).

    La self.contentSizeForViewInPopover línea es preservar el tamaño cuando el usuario llega a espalda. Supongo que se podría poner esta línea en otro lugar, como viewWillAppear o donde quieras.

    Parece funcionar…

  9. 2

    En el -(void)viewDidLoad de todos los de la vista de los controladores que se están utilizando en la navegación escribir el código:

    self setContentSizeForViewInPopover:CGSizeMake(320, 500)];
    
  10. 2

    Hay dos formas de establecer la contentSizeForViewInPopover en el guión gráfico. Usted puede fijar su vista de los controladores que están con su navegación controlador, de forma Libre y establecer la raíz vistas al tamaño deseado. O, usted puede mantener la simulación de la métrica como se infiere y de verificación «Usar Tamaño Explícito» y establecer el tamaño que desea que.

    Luego, en cada controlador de vista de que está dentro de su controlador de navegación, añadir el 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 ven en alineada con la parte superior y, a continuación, la altura se ajustará en consecuencia.

    De esta manera, usted no tiene que reemplazar contentSizeForViewInPopover, o especificar algún otro tamaño, específicamente en su punto de vista de los controladores. Todo está en el guión gráfico.

    Si uno de su punto de vista controladores tiene una altura variable, entonces usted necesita para reemplazar contentSizeForViewInPopover en que la vista de este modo…

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

    Estas cosas pueden haber trabajado una vez, pero no con xCode 6, donde contentSizeForViewInPopover está en desuso. Por suerte, es respetado en el storyboard el tiempo de carga. He descargado un editor de xml (Xmplify) y hackeado el guión gráfico. Establecer la clave contentSizeForViewInPopover el tamaño que desee. Guardar y reemplazar (haga una copia primero) guión gráfico.

    Más específicamente :

    < viewController>
    
         <value key="contentSizeForViewInPopover" type="size" width="450" height="280" />
    
    </viewController>
    
  12. 0

    No trabajo para mí, cuando yo uso este:

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

    Cuando aparecen ventana emergente está todo bien, pulse el botón de encendido vc1 y empuje vc2 a la navegación controlador de

    Siguiente volver a vc1 (raíz) pulsando el botón en vc2 (popToRootViewController método);

    Podemos ver que la ventana emergente de cambio de tamaño, pero vc1 tamaño es viejo… ¿ESTO QUÉ ES???

    Ok, ahora trabajo… Añadir ventana emergente de la propiedad en mi controlador

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

    Ejecución Swift 4 y iOS 11 la única solución posible era para mí. El uso de showViewController:sender: and showDetailViewController:sender: en lugar de presentViewController:animated:completion:.

    De la Manzana Doc

    La showViewController:remitente: y showDetailViewController:remitente: métodos ofrecen la más adaptable y flexible para mostrar la vista de los controladores. Estos métodos dejan la presentación de controlador de vista de decidir la mejor manera de manejar la presentación. Por ejemplo, un contenedor de controlador de vista podría incorporar el controlador de vista como un niño en lugar de presentarlo de forma modal. El comportamiento predeterminado presenta el controlador de vista modal.

Dejar respuesta

Please enter your comment!
Please enter your name here