如何解决更多控制更新UITableView和UITableViewCell
| 我正在尝试实现扩展UITableViewCells
,我可以完全控制从折叠到展开再返回的过渡动画。
我有一个数组cellDataList
,它保存我的UITableViewCells
的状态,即height
,color
,data
,isExpanded
等。
我实现:
- (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:] ().
这将为该单元格设置新帧,然后我假设以某种方式调用了“ 17”,因此该单元格可以为所提供的帧进行渲染。
[cell setNeedsDisplay]
最终将调用我的自定义drawRect:
并呈现单元格的内容。这按预期工作,但我无法确定
确定我将如何为背景制作帧动画,也以某种方式进行,仅在单击时才执行,而不是每次调用setFrame:
时(在滚动等过程中)。
当我在上面执行tableView动画以为新的单元格大小腾出空间时,它是
这个动画我想用单元格的背景视图“模仿”。
我在Tweetbot和path这样的应用程序中看到了这种效果,但是我似乎无法复制它。
希望有人能在正确的方向帮助我,谢谢:)
解决方法
我不确定我是否完全理解您的问题:)但是您可以使用键值观察器(KVO)来检查何时需要播放动画,然后调用表重新加载方法。
- (void)reloadTable
{
if (self.isViewLoaded) {
[self.tableView reloadData];
}
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
[self reloadTable];
}
, 最好的方法是在被点击的单元格下方添加一个虚拟单元格。我在这里全面解释。
基本上:
跟踪didSelectRowAtIndexPath
中被窃听的单元格并进行适当更新。哪一个需要删除?新的虚拟单元格将在哪里?
只要存在虚拟单元格,就返回正确的帐户。
考虑到虚拟单元格不是模型的一部分这一事实。使indexPath
偏移。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。