Как получить высоту строки UITableView для автоматического размера до размера UITableViewCell?
Как получить высоту строки UITableView для автоматического размера до размера UITableViewCell?
Итак, предполагая, что я создаю UITableViewCell в построителе интерфейсов, а высота - больше, чем стандартный размер, как я могу получить высоту строки UITableView, чтобы ее авторизовать? (т.е. в отличие от того, чтобы вручную было измерять высоту в построителе интерфейса, а не программную настройку)
Ответы
Ответ 1
Если все ячейки одинаковы, установите для свойства rowHeight
значение UITableView
размер вашей ячейки. Если они различаются по содержанию, вам придется реализовать -tableView:heightForRowAtIndexPath:
и рассчитать высоту для каждой строки на основе вашего источника данных.
Ответ 2
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);
}
Ответ 3
В xib с вашим табличным представлением вы можете добавить объект ячейки и связать его с IBOutlet в исходном коде. Вы не будете использовать его нигде, вы просто будете использовать это, чтобы получить высоту ячейки.
Затем в tableView:heightForRowAtIndexPath:
вы можете использовать этот объект для получения высоты. Это не 100% автоматическое, но, по крайней мере, это избавляет вас от необходимости вручную обновлять исходный код при внесении изменений в представление ячейки в IB.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return myDummyCellObject.bounds.size.height;
}
Если все строки одного типа (ячейки), вы можете программно установить свойство tableView.rowHeight
вместо реализации вышеперечисленного метода делегата. Зависит от вашего сценария.
О, и убедитесь, что вы не забыли выпустить myDummyCellObject в -dealloc
.
Ответ 4
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;
}
Ответ 5
Начиная с 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
}
}