2011-06-11 49 views
0

我想实现扩展UITableViewCells我完全控制从折叠到展开和返回的过渡动画。 我有一个数组,cellDataList,持有的我UITableViewCells的状态,即heightcolordataisExpanded更多控制更新UITableView和UITableViewCell

我实现:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (indexPath == selectedIndex) 
     return expandedHeight; 
    return collapsedHeight; 

} 

和我实现:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    /* 
    some logic that tests if the indexPath is already selected, 
    which will collapse the cell, if a previous cell needs to be collapsed before the 
    new expands etc. 
    */ 

    [tableView beginUpdates]; 
    [tableView reloadRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationNone]; 
    [tableView endUpdates]; 
} 

我的手机是一个自定义UITableViewCell我在那里建立我的内容drawRect: cell有一个UIView(背景),用作单元格的自定义背景,我希望这个视图可以
将动画从折叠到展开和返回,而不仅仅是一个“跳跃”中的setFrame,就像现在一样。

我真的不知道在哪里'截取'tableView更新链,来实现这一点。

当我做了上面的[tableView beginUpdates] - [tableView endUpdates],它开始变得模糊不清。 我认为

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

被称为更新细胞 在指定的索引。这又会询问heightForCellAtIndexPath哪个高度来设置单元格。如果我在定制单元设置一个断点setFrame:方法 我可以看到来电是

[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:](). 

此设置单元格的新帧,那么我想[cell setNeedsDisplay]以某种方式调用,所以电池可以使所提供的框架。 [cell setNeedsDisplay]最终会调用我的自定义drawRect:并呈现单元格的内容。这个按预期工作,但我不知道在哪里以及如何为我的背景设置动画框架,也是以某种方式进行动画,所以只有在单击时才会完成,并且不是每次调用setFrame:(在滚动等过程中)。 当我做了上面的tableView动画,为新的单元格大小腾出空间,这是我想用我的单元格上的背景视图“模仿”这个动画的 。

我在Tweetbot和路径等应用程序中看到了这种效果,但似乎无法复制它。

希望有人可以帮助我在正确的方向,谢谢:)

回答

0

我不能完全确定,我理解你的问题正是:)但是你可以使用密钥值观察(志愿)来检查当您需要玩你的动画,然后调用你的表重载方法。

- (void)reloadTable 
{ 

if (self.isViewLoaded) { 
    [self.tableView reloadData]; 
} 

}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
[self reloadTable]; 
} 
+0

感谢你,真的很短的版本是“有没有一种方法来创建一个uitableviewcells高度的动画,这样它就可以与uitableviews动画同步,在它旁边移动,为一个新大小的单元腾出空间”。你提供的代码在哪里去?控制器,customcell或tableview? – RickiG 2011-06-12 09:07:23

+0

你应该在tableView中动态改变你的单元格的高度,但是之后你需要重新加载你的表格。尝试调试您的代码以检查它是否涉及到您的新高度值。但是,一旦不改变这一点,你就编写自定义单元格。在您的控制器部件中,访问您的自定义单元并更改其高度,然后重新加载表格。 – 2011-06-12 11:05:12

0

做到这一点,最好的方法是补充,被窃听下面的单元格虚设单元。我向你解释这个秘密here

基本上是:

  1. 什么细胞的跟踪都被窃听你的didSelectRowAtIndexPath并适当地更新。哪一个需要删除?下一个新的虚拟细胞在哪里?
  2. 每当存在虚拟单元格时都返回正确的帐户。
  3. 考虑到虚拟单元不属于您的模型。抵消indexPath