Tengo un UIViewController que contiene un UITableView.
Este UIViewController se muestran en un UIPopoverController.

Ahora, la cosa está en que el número de elementos en la tableView no es constante, y quiero que el tamaño de la ventana emergente (lo que es – el popoverContentSize), para ajustar de acuerdo con el número de elementos en la tableView

Ingenuamente, pensaba que si me voy a fijar el contentSizeForViewInPopover en viewDidLoad después de que me carga el tableView con todos los elementos – Que voy a hacer.

No.

Así que el que sea más corto, mi pregunta es: ¿Cómo puedo cambiar el popoverContentSize directamente desde el contentViewController – después de que se haya presentado?

Apéndice:
Cómo cambiar Dinámicamente el contentSize de UIPopoverController?

InformationsquelleAutor Avi Shukron | 2011-12-15

8 Comentarios

  1. 47

    Podría ser muy tarde para responder, pero para el nuevo usuario de iOS 7
    por favor, utilice la siguiente línea en su UIViewController i,e contentViewController de su UIPopOverViewConotroller

    -(void) viewDidAppear:(BOOL)animated{
        [super viewDidAppear:animated];
        self.preferredContentSize=myTableView.contentSize;
    }

    Espero que esto ayude para iOS 7 de usuario.

    • esto puede funcionar mejor en ViewWillAppear, como sucede antes de la vista aparece.
    • 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
    • Aceptado su respuesta, porque más arriba-a-fecha. Gracias!
    • Echa un vistazo @Robert respuesta por debajo de – agradable y limpio
    • Es posible que también necesite [myTableView sizeToFit]; Si la tabla tiene un tamaño predeterminado. Y esto también debe ir en el viewWillAppear en lugar de viewDidAppear método.
    • En iOS 8 esto tiene que ir en viewDidAppear debido a que el auto.formato tableview no es apropiada sin embargo, cuando viewWillAppear se llama, es decir, su altura es cero.

  2. 9

    Bueno, al final hice algo que no estoy seguro de si es lo correcto a hacer, pero se está trabajando.

    He añadido una referencia en mi contentViewController a la popoverController:

    @property (nonatomic , assign) UIPopoverController *popoverControllerContainer;

    Entonces, he añadido el código de cambio de tamaño para viewWillAppear y viewDidAppear:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        [self.tableView reloadData];
    }
    
    -(void) viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        self.contentSizeForViewInPopover = self.tableView.contentSize;
    }
    
    -(void) viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
        [self.popoverControllerContainer setPopoverContentSize:self.contentSizeForViewInPopover animated:YES];
    }

    Así, mantener una referencia a la ventana emergente es una especie de hack-ish, así que estoy abierto a escuchar mejor las ideas.

    • Yo uso el mismo mecanismo. Estoy agregando método createPopover a la UIViewControllers que se utiliza como ventana emergente de contenidos. Los métodos que se crea una ventana emergente de self y, a continuación, guarda la ventana emergente instancia de un nuevo acceso.
    • Hola @Avraham Su respuesta fue la que yo he usado y está funcionando muy bien. Tengo una pregunta acerca de la solución: ¿por qué se establece la contentsize de la vista en el aparecerá método y la ventana emergente tamaño en el que hizo aparecer? Porqué no puede hacerse sólo en uno de los dos métodos, ya que he intentado y no funciona?
    • El uso tanto de los códigos de cada uno de los otros y que va a trabajar 🙂
  3. 7

    Un UIViewController clase tiene la propiedad

    self.contentSizeForViewInPopover

    que va a cambiar el tamaño del pop sobre w/out necesidad de añadir una referencia a él.

    Y desarrollar una solución, he utilizado el método de rectForSection: para obtener el tamaño de la sección (el mío sólo tiene 1 sección, de manera bastante fácil de conseguir) y, a continuación, agrega la altura de la barra de navegación (parece ser 20). así que soy capaz de crear la ventana emergente el tamaño de la tabla terminada la vista:

    CGRect sectionRect = [view.tableView rectForSection:0];
    
    if (sectionRect.size.height + 20 < POPOVER_SIZE.height)
        view.contentSizeForViewInPopover = CGSizeMake(POPOVER_SIZE.width, sectionRect.size.height + 20);
    else
        view.contentSizeForViewInPopover = POPOVER_SIZE;

    podría resultar más difícil con varias secciones, yo no lo intente. debe ser capaz de resumir la sección alturas, pero puede haber algunos problemas de espaciado de que yo no sé acerca de.

    • Su obsoleto, el uso de «preferredContentSize» de iOS7 y más tarde.
  4. 7

    Para iOS 7 o superior.

    - (CGSize)preferredContentSize {
        return CGSizeMake(320, 550);
    }

    Si usted es un hijo de un contenedor, re-dirigir el tamaño del contenido para ti. E. g. En un UINavigationController subclase:

    - (CGSize)preferredContentSize {
        return self.topViewController.preferredContentSize;
    }
    • Sólo una nota para los demás que tratan de Robert enfoque. Es muy limpio y funciona para esta pregunta. Puede que no funcione para usted sin embargo, si estás presentando un UITableView dentro de un UINavigationController. Avinash del que parece funcionar en ese caso.
    • Buen lugar. Yo preferiría subclase UINavigationController para obtener su preferido barra de estado de su topViewController. En general me parece que el enfoque de declarar lo que usted requiere mejor que el establecimiento de un valor, ya que evita errores cuando en 2 clases diferentes pueden atropellar con la misma propiedad con diferentes valores que puede conducir a resultados diferentes según el orden de hacer las cosas. Esto es similar a ¿por qué preferredStatusBarStyle fue creado en iOS 7.
    • Esta fue la única solución que funcionó para mí. Configuración de auto.preferredContentSize no tuvo ningún efecto.
  5. 1

    Mi aplicación tiene un menú con submenús procedente de una ventana emergente y embebido en un controlador de navegación, es decir, algo así como UINavigationController -> TopMenuViewController -> SubMenuViewControllerxN.

    Ninguna de las soluciones anteriores funciona para mí.

    Mi solución: En mi menú raíz del controlador de vista de clase, de la cual todas las otras menú de la vista de los controladores de heredar, agregue el código siguiente:

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.navigationController.preferredContentSize  = CGSizeMake(450.0f, 0.0f);//increase standard width (320.0)
    }
    
    
    - (void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
        self.navigationController.preferredContentSize = self.tableView.contentSize;
    }
  6. 0

    Yo tenía este mismo problema y ninguna de las respuestas que he encontrado trabajado. Yo improvisado que creo que funciona bien.

    Tengo un array en mi initWithCoder que sostiene mis valores. Yo simplemente ejecutar este código:

    - (id)initWithCoder:(NSCoder *)aDecoder
    {
    //Popover Choices
    
    _importantChoices = [NSMutableArray array];
    [_importantChoices addObject:@"Bakery"];
    [_importantChoices addObject:@"Beverage Dry Mix"];
    [_importantChoices addObject:@"Beverage RTD"];
    [_importantChoices addObject:@"Crisps"];
    [_importantChoices addObject:@"Meat"];
    [_importantChoices addObject:@"Supplements"];
    
    
    //Calculate size of Popover
    self.clearsSelectionOnViewWillAppear = NO;
    NSInteger rowsCount = [_importantChoices count];
    NSInteger singleRowHeight = [self.tableView.delegate tableView:self.tableView
                                           heightForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    NSInteger totalRowsHeight = rowsCount * singleRowHeight;
    CGFloat largestLabelWidth = 0;
    for (NSString *tmp in _importantChoices) {
        CGSize labelSize = [tmp sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20.0f]}];
        if (labelSize.width > largestLabelWidth) {
            largestLabelWidth = labelSize.width;
        }
    }
    CGFloat popoverWidth = largestLabelWidth + 100;     //Add a little padding to the width
    self.preferredContentSize = CGSizeMake(popoverWidth, totalRowsHeight);
    return self;
    }
  7. 0

    iOS8/9 solución – sólo tienes que reemplazar preferredContentSize y la fuerza de la vista de tabla para el diseño antes de regresar es contentSize.

    - (CGSize)preferredContentSize {
        [self.tableView layoutIfNeeded];
        return self.tableView.contentSize;
    }
    • este crece la vista, pero nunca se reduce a que si incrustado en un UINavigationController jerarquía.
  8. 0

    Esto debe hacer el truco

    override func viewWillLayoutSubviews() {
      super.viewWillLayoutSubviews()
    
      self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)}

Dejar respuesta

Please enter your comment!
Please enter your name here