除了 heightForRowAtIndexPath 之外,没有其他机制可以指定单元格高度。除非您在该方法中正确考虑了扩展单元格,否则您将发现其他单元格在其上方运行或隐藏在其下方。从我忘记设置 heightForRowAtIndexPath 的愚蠢代码中,我很确定您的其他单元格将显示在它上面。
由于您说的是数千行,我们假设用户无法重新排列单元格。
您可以做的是在用户点击给定单元格时存储展开单元格的索引路径。然后,heightForRowAtIndexPath 可能如下所示:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{
if ([indexPath isEqual:lastSelectedIndexPath])
{
return 80;
}
else {
return 44;
}
}
如果你真的想要多个选择,你可以将适当的索引路径存储到一个数组中并像这样检查它们:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{
CGFloat cellHeight = 44;
for (NSIndexPath *expandedIndexPath in expandedIndexPathsArray)
{
if ([indexPath compare:expandedIndexPath] == NSOrderedSame)
{
cellHeight = 80;
break;
}
}
return cellHeight;
}
让动画看起来正确需要一些工作。我已经玩弄了这个特定的 UI 想法有一段时间了,但永远无法让自己坐下来真正实现它。您可以做的一件事是显示一个虚拟视图,当您更新它后面的 tableview 时会产生动画。
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPathswithRowAnimation:(UITableViewRowAnimation)animation
您可能对此感兴趣,因为您可以使用单元格动画来模拟下方单元格的移动以适应您的扩展。
如果您可以完全放弃为单元格的框架设置动画,则可以在设置新高度后对展开的数据进行不透明动画。
这是一个硬汉,但如果你让它发挥作用,我敢打赌它会很酷。祝你好运。