更多地控制更新UITableView和UITableViewCell

时间:2011-06-11 22:44:59

标签: cocoa-touch uitableview

我正在尝试实现扩展UITableViewCells,我可以完全控制从折叠到展开和返回的过渡动画。 我有一个数组cellDataList,其中包含UITableViewCells的状态,即heightcolordataisExpanded等。< / p>

我实施:

- (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:中构建了我的内容 单元格有一个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和路径等应用中看到了这种效果,但似乎无法复制它。

希望有人可以帮助我朝着正确的方向前进,谢谢:)。

2 个答案:

答案 0 :(得分:0)

我并不完全确定我完全理解你的问题:)但你可以使用Key Value Observer(KVO)来检查你何时需要播放动画然后调用你的表重载方法。

- (void)reloadTable
{

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

}

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

答案 1 :(得分:0)

执行此操作的最佳方法是在轻敲的单元格下方添加虚拟单元格。我解释这个彻底的here

基本上:

  1. 跟踪didSelectRowAtIndexPath中已点击的单元格并进行相应更新。哪一个需要删除?下一个新的虚拟单元将在哪里?
  2. 每当虚拟单元格存在时,返回正确的帐户。
  3. 说明虚拟单元格不是模型的一部分。抵消indexPath