我正在尝试实现扩展UITableViewCells
,我可以完全控制从折叠到展开和返回的过渡动画。
我有一个数组cellDataList
,其中包含UITableViewCells
的状态,即height
,color
,data
,isExpanded
等。< / 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和路径等应用中看到了这种效果,但似乎无法复制它。
希望有人可以帮助我朝着正确的方向前进,谢谢:)。
答案 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。
基本上:
didSelectRowAtIndexPath
中已点击的单元格并进行相应更新。哪一个需要删除?下一个新的虚拟单元将在哪里?indexPath
。