由于在heightForRowAtIndexPath
之前调用cellForRowAtIndexPath
,我假设如果我想在cellForRowAtIndexPath
内修改高度,我可以这样做。看来我做不到。我已经通过NSLog
进行了测试,如果我更改cell.frame.size.height
,则更改会正确存储在那里,但是单元格本身不会采用新的大小(它使用我在{{{ 1}})。
是否有另一种方法可以调整heightForRowAtIndexPath
之后某个时刻调用的单元格高度?如果没有,还有另一种方法吗?我需要使用cellForRowAtIndexPath
,因为我正在决定是否依次将图像随机添加到每个单元格。
答案 0 :(得分:6)
UITableViewDelegate heightForRowAtIndexPath
和UITableView rowHeight
是指定单元格高度的唯一机制。 tableview本身正在调整基于这些的单元格大小;你不能自己设置你的细胞框架并期望它工作。
您可以做的最好的事情是能够在创建单元格之前提前计算单元格高度。我经常会定义一个+ (CGFloat) cellHeightWithDatum: (id) datum forWidth: (CGFloat) tableWidth
方法,以便从heightForRowAtIndexPath
调用我的单元格类。这里的基准是驱动单元内容的模型。然后,该方法查看模型并计算出细胞需要的高度。
如果在创建单元格后完全需要更改单元格的高度,可以通过要求tableview重新加载单元格来完成此操作,或者在调用reloadData时刷新整个表格。这个技巧是通过以下方式完成的:
[tableView beginUpdates];
[tableView endUpdates];
要重新加载单个单元格:UITableView reloadRowsAtIndexPaths:withRowAnimation:
答案 1 :(得分:2)
您应该将随机决定的代码添加到heightForRowAtIndexPath
方法中。
使用NSMutableDictionary
跟踪使用图片的NSIndexPath
。
答案 2 :(得分:0)
你应该在cellForRowAtIndexPath之前的某个时候随机决定,然后在dataSource的数据结构中为每个indexPath存储一个标志,无论是否有图像存在。你可以在heightForRowAtIndexPath中执行它,如果确定是否有图像的工作是便宜的。像这样:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
BOOL showingAnImage = arc4random() % 2;
// self.imageIndexPaths is some data structure that lets you associate a value to an index path
self.imageIndexPaths[indexPath] = @(showingAnImage);
if (showingAnImage){
// return height of a cell with an image
} else {
// return height of a cell without an image
}
}
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
if ([self.imageIndexPaths[indexPath] boolValue]){
// Configure for image
} else {
// Configre without image
}
return cell;
}
在cellForRowAtIndexPath:中更改单元格的大小将不起作用。
答案 3 :(得分:0)
您需要跟踪需要扩展的索引。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if([self shouldBeExpanded:indexPath.row]) { //method that checks if this cell should be expanded. You'll need to check the array if it contains the row.
return kCellHeightExpanded;
}
return kCellNormalHeight;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//set cell to be expanded
[self expandCellAt:indexPath.row]; //method that sets which cell is expanded. You'll need to implement this yourself. Use an array to track which row should be expanded
//this causes heightForRowAtIndexPath: to be called again
[tableView beginUpdates];
[tableView endUpdates];
}