Динамическая высота UITableView в UIPopoverController (contentSizeForViewInPopover)? - PullRequest
9 голосов
/ 11 июня 2011

У меня есть ipad popover, который содержит UITableView. После заполнения таблицы в ней обычно есть только несколько элементов (4-5), поэтому я ищу способ изменить размер всплывающего окна (contentSizeForViewInPopover) до фактической высоты таблицы (суммарной высоты всех ее элементов). клетки).

Итак, у меня есть высота, но я не уверен, куда звонить contentSizeForViewInPopover, я попытался вызвать ее: viewDidAppear и viewWillAppear, но безуспешно, так как кажется, что таблица заполняется позже, а фактическая высота доступна только позже.

Есть мысли по этому поводу? Спасибо!

РЕДАКТИРОВАТЬ: мои клетки имеют разную высоту в зависимости от содержания, которое они несут, я не могу предварительно рассчитать высоту с помощью noOfRows * cellHeight.

Ответы [ 7 ]

18 голосов
/ 15 февраля 2012

Я хотел изменить contentSizeForViewInPopover, когда мое представление, казалось, соответствует UITableView, а также когда я вызываю reloadData, поскольку я вызываю это только при удалении или добавлении строк или разделов.

Следующий метод вычисляет правильную высоту и ширину и устанавливает contentSizeForViewInPopover

-(void) reloadViewHeight
{
    float currentTotal = 0;

    //Need to total each section
    for (int i = 0; i < [self.tableView numberOfSections]; i++) 
    {
        CGRect sectionRect = [self.tableView rectForSection:i];
        currentTotal += sectionRect.size.height;
    }

    //Set the contentSizeForViewInPopover
    self.contentSizeForViewInPopover = CGSizeMake(self.tableView.frame.size.width, currentTotal);
}
11 голосов
/ 07 апреля 2013

Этот ответ любезно предоставлен @ BenLings из одного из комментариев выше.Это действительно чистое решение, и стоит иметь свой ответ:

- (CGSize)contentSizeForViewInPopover {
    // Currently no way to obtain the width dynamically before viewWillAppear.
    CGFloat width = 200.0; 
    CGRect rect = [self.tableView rectForSection:[self.tableView numberOfSections] - 1];
    CGFloat height = CGRectGetMaxY(rect);
    return (CGSize){width, height};
}
1 голос
/ 11 мая 2016

Это должно сработать

override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()

        self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)
 }
1 голос
/ 23 марта 2014

Нет необходимости создавать искусственный хук, это хорошо работает (по крайней мере, на iOS 7):

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

    CGSize size = self.view.bounds.size;
    size.height = fmaxf(size.height, self.tableView.contentSize.height);
    self.preferredContentSize = size;
}
1 голос
/ 26 февраля 2014

Я сделал это так с контроллера, содержащего таблицу:

- (void)updatePopoverContentSize {
    CGSize size = { CGFLOAT_MAX, CGFLOAT_MAX };
    size = [self.tableView sizeThatFits: size];
    size.width = 320; // some hard-coded value table doesn't return anything useful for width 
    size.hight = MIN(size.hight, 400); // make sure it is not too big.

    self.contentSizeForViewInPopover = size;
}
1 голос
/ 11 июня 2011

Косвенный подход:

Установите пользовательскую высоту для UITableViewCell, используя

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [indexPath row] * 40;
}

Найдите общее количество строк в точке вашей программы ... Используя numberOfRowsInSection, получите количество строк.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

return [self.yourArray count];

//yourArray is the array with which you are populating the tableView
}

Если у вас есть более одного раздела, умножьте его на результат для количества строк для эффективного количества строк.

Сейчас

UITableView Actual Height = Height of UITableViewCell * Total number of rows.

Обновленный ответ:

Если размеры ячеек различаются, возможно, вам придется выполнить одно из следующих действий:

  1. Принудительный размер текста, чтобы все ячейки имели одинаковую высоту ... Это можно сделать, используя

    sizeToFit '

  2. Вам нужно будет найти высоту текста, используя другую функцию. Что-то вроде ...

    • (с плавающей точкой) рассчитывается высота { вернуть textLabel.frame.origin.ytextLabel.frame.size.height5; }
  3. Вы можете посмотреть ЭТО учебник по изменению размера UITableViewCell для переменного текста.

  4. https://discussions.apple.com/thread/1525150?start=0&tstart=0

0 голосов
/ 11 июня 2011

Альтернативный способ получить высоту - добавить представление UITableViewController с alpha, установленным на 0.0, к иерархии представления, а затем получить размер содержимого, используя свойство contentSize представления таблицы. , Это возможно, так как представление таблицы является подклассом представления прокрутки.

Получив размер содержимого, установите значение contentSizeForViewInPopover, а затем вставьте его в всплывающее окно.

...