如何让 UITableView 行高自动调整为 UITableViewCell 的大小?
因此,假设我在 Interface Builder 中创建 UITableViewCell,并且它的高度大于标准尺寸,我怎样才能让 UITableView 行高自动调整为它?(即,与手动测量界面生成器中的高度相反,而不是以编程方式设置它)
如何让 UITableView 行高自动调整为 UITableViewCell 的大小?
因此,假设我在 Interface Builder 中创建 UITableViewCell,并且它的高度大于标准尺寸,我怎样才能让 UITableView 行高自动调整为它?(即,与手动测量界面生成器中的高度相反,而不是以编程方式设置它)
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);
}
如果所有单元格都相同,请将rowHeight
属性设置UITableView
为单元格的大小。如果它们基于内容都不同,您将不得不-tableView:heightForRowAtIndexPath:
根据您的数据源实现并计算每行的高度。
在带有 tableview 的 xib 中,您可以添加一个单元格对象并将其链接到源代码中的 IBOutlet。您不会在任何地方使用它,您只会使用它来获取单元格的高度。
然后,tableView:heightForRowAtIndexPath:
您可以使用该对象来获取高度。它不是 100% 自动的,但至少这样可以省去在 IB 的单元格视图中进行更改时手动更新源代码的麻烦。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return myDummyCellObject.bounds.size.height;
}
如果所有行都属于同一类型(单元格),您可以通过编程方式设置tableView.rowHeight
属性,而不是实现上面的委托方法。取决于你的场景。
哦,请确保您不要忘记在-dealloc
.
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;
}
从 iOS 8 开始,您可以通过在表格视图中指定以下选项来使用自调整单元格:
tableView.estimatedRowHeight = 85.0
tableView.rowHeight = UITableView.automaticDimension
只要系统可以根据现有约束或内容计算行,这将起作用。请注意,如果您设置了 automaticDimension,则不会调用 heightForRowAtIndexPath!
有时对于更复杂的数据,一些单元格可以自动计算,但其他单元格需要特定的高度计算逻辑。在这种情况下,您应该只设置estimatedRowHeight,然后使用可以正常工作的单元格的自动逻辑实现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
}
}