2009-12-14 75 views
5

可能重复:
Can you animate a height change on a UITableViewCell when selected?动画的UITableViewCell高度

我一直在做谷歌搜索,试图找出这样做的正确方法很多,到目前为止我很茫然。

我已经用我自己的视图对UITableViewCell进行了子类化,我试图在UITableViewCell被选中时展开的高度以及当它再次被选中时展开。此表有可能包含数千行,所以我不想覆盖tableView的heightForRowAtIndexPath。理想情况下,我希望能够一次扩展一个以上的单元格,但这并不重要。做这个的最好方式是什么?

谢谢 贾斯汀

回答

6

没有其他机制比指定细胞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 

可能是这个兴趣,你也许能够使用的细胞动画来模拟下面的单元格的运动,以适应您的扩展。

如果您可以放弃为单元格的框架完全制作动画,则可以在设置新高度后对已展开的数据执行不透明动画。

这是一个棘手的问题,但如果你让它工作,我敢打赌它会很酷。祝你好运。

+1

感谢达尼洛,你让我开始了正确的道路。我最终通过在didSelectRowAtIndexPath中使用reloadRowsAtIndexPaths来获得它的工作。我检查单元格是否展开,并在heightForRowAtIndexPath中设置相应的高度,就像您提到的那样。再次感谢! – Justin 2009-12-15 01:23:01

+1

太酷了!很高兴给你一个有用的推动。希望它能解决问题。也许最近我会尝试一下自己。 – 2009-12-15 02:58:06

+1

'[indexPath compare:expandedIndexPath] == NSOrderedSame'应写为'[indexPath isEqual:expandedIndexPath]' – user102008 2011-01-11 22:59:01