Как получить высоту строки UITableView для автоматического размера к размеру UITableViewCell? - PullRequest
21 голосов
/ 02 марта 2011

Как получить высоту строки UITableView для автоматического изменения размера UITableViewCell?

Итак, предположим, что я создаю UITableViewCell в Интерфейсном Разработчике, и его высота больше стандартного размера, как я могу получить высоту строки UITableView для автоматического изменения размера? (то есть в отличие от необходимости вручную измерять высоту в конструкторе интерфейсов и затем устанавливать ее программно)

Ответы [ 5 ]

37 голосов
/ 15 ноября 2011

http://www.cimgf.com/2009/09/23/uitableviewcell-dynamic-height/ отличный урок для этого.

Основной бит

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
  // Get the text so we can measure it
  NSString *text = [items objectAtIndex:[indexPath row]];
  // Get a CGSize for the width and, effectively, unlimited height
  CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
  // Get the size of the text given the CGSize we just made as a constraint
  CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
  // Get the height of our measurement, with a minimum of 44 (standard cell size)
  CGFloat height = MAX(size.height, 44.0f);
  // return the height, with a bit of extra padding in
  return height + (CELL_CONTENT_MARGIN * 2);
}
32 голосов
/ 02 марта 2011

Если все ячейки одинаковы, установите для свойства rowHeight значение UITableView равное размеру вашей ячейки. Если все они различаются в зависимости от содержимого, вам придется реализовать -tableView:heightForRowAtIndexPath: и рассчитать высоту для каждой строки на основе вашего источника данных.

13 голосов
/ 02 марта 2011

В xib с вашим табличным представлением вы можете добавить объект ячейки и связать его с IBOutlet в вашем исходном коде. Вы нигде не будете его использовать, вы просто используете его, чтобы получить высоту ячейки.

Затем в tableView:heightForRowAtIndexPath: вы можете использовать этот объект, чтобы получить высоту. Он не на 100% автоматический, но по крайней мере это избавляет вас от необходимости вручную обновлять исходный код при внесении изменений в представление ячейки в IB.


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return myDummyCellObject.bounds.size.height;
}

Если все строки имеют одинаковый тип (ячейку), вы можете программно установить свойство tableView.rowHeight вместо реализации метода делегата, описанного выше. Зависит от вашего сценария.

О, и убедитесь, что вы не забыли выпустить myDummyCellObject в -dealloc.

0 голосов
/ 14 декабря 2018

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

tableView.estimatedRowHeight = 85.0
tableView.rowHeight = UITableView.automaticDimension

Это будет работать до тех пор, пока системаМожно рассчитать строки на основе существующих ограничений или содержимого.Позаботьтесь о том, чтобы, если вы установили AutomaticDimension, то heightForRowAtIndexPath не вызывалось!


Иногда для более сложных данных некоторые ячейки могут быть вычислены автоматически, но другим нужна специальная логика вычисления высоты.В этом случае вы должны только установить оценку RowHeight и затем реализовать cellForRowAtIndexPath с автоматической логикой для ячеек, которая может работать правильно:

// Set the estimated row height in viewDidLoad, but *not* automatic dimension!
override func viewDidLoad() {
    // other viewDidLoad stuff...
    tableView.estimatedRowHeight = 85.0
    tableView.delegate = self
}

// Then implement heightForRowAtIndexPath delegate method
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if theAutomaticCalculationWorksForThisRow {
        return UITableView.automaticDimension
    } else {
        // Calculate row height based on custom logic...
        let rowHeight = 85.0
        return rowHeight
    }
}
0 голосов
/ 04 июля 2016
self.tableView.estimatedRowHeight = 65.0; // Estimate the height you want
self.tableView.rowHeight = UITableViewAutomaticDimension; // auto change heights for multiple lines cells.

При реализации UITableViewDataSource требуется метод:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = [self.todoArray objectAtIndex:indexPath.row];
    cell.textLabel.numberOfLines = 0; // allow multiple lines showing up

    return cell;
}
...