it-swarm.com.ru

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

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

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

21
Greg

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

31
Mark Adams

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);
}
37
Brian

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

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


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

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

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

13
Andrei Stanescu

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

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

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


Иногда с более сложными данными некоторые ячейки могут быть вычислены автоматически, но другие нуждаются в определенной логике вычисления высоты. В этом случае вы должны only установить оценочный 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
Aron
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;
}
0
AidenX