没有其他机制比指定细胞heightForRowAtIndexPath高度。除非您在该方法中正确计算扩展的单元格,否则您会发现其他单元或者在其上运行或隐藏在其下。从忘记设置heightForRowAtIndexPath的boneheaded代码,我很确定您的其他单元格将显示在其上。
由于您正在谈论数千行,因此我们假定用户无法重新排列单元格。
当用户点击给定单元格时,您可以做的是存储扩展单元格的索引路径。然后,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;
}
获取动画看起来正确会需要一些工作。我已经玩弄了这个特定的用户界面想法一段时间,永远不会让自己坐下来,真正实现它。你可以做的一件事是显示一个虚拟视图,在更新其后面的tableview的同时显示动画。
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPathswithRowAnimation:(UITableViewRowAnimation)animation
可能是这个兴趣,你也许能够使用的细胞动画来模拟下面的单元格的运动,以适应您的扩展。
如果您可以放弃为单元格的框架完全制作动画,则可以在设置新高度后对已展开的数据执行不透明动画。
这是一个棘手的问题,但如果你让它工作,我敢打赌它会很酷。祝你好运。
感谢达尼洛,你让我开始了正确的道路。我最终通过在didSelectRowAtIndexPath中使用reloadRowsAtIndexPaths来获得它的工作。我检查单元格是否展开,并在heightForRowAtIndexPath中设置相应的高度,就像您提到的那样。再次感谢! – Justin 2009-12-15 01:23:01
太酷了!很高兴给你一个有用的推动。希望它能解决问题。也许最近我会尝试一下自己。 – 2009-12-15 02:58:06
'[indexPath compare:expandedIndexPath] == NSOrderedSame'应写为'[indexPath isEqual:expandedIndexPath]' – user102008 2011-01-11 22:59:01