我尝试实现一个tableView,其中行插入其他行,动画显示行。我更新数据源的数组并调用:
[self.tableView insertRowsAtIndexPaths:addedIndexPaths withRowAnimation:(UITableViewRowAnimationMiddle)];
我希望tableview根本不滚动,并且要插入屏幕上的行(不在可见区域之上)。 在某些部分,特别是tableview的最后一部分,单元格将tableview滚动插入完全不同的部分。
我尝试了不同的行动画,调用了layoutIfNeeded和beginUpdate / endUpdate块,在beginUpdate / endUpdate块中设置了正确的内容偏移量或重新加载了整个部分。
没有任何作用。 scrollview总是向上滚动。
单元格使用autolayout-constraints自我调整大小。在tableview的上半部分,按照我的预期插入单元格。
如何在插入动画的单元格时修复内容偏移量? 我该如何调试该动画?
答案 0 :(得分:1)
我遇到了同样的问题,在尝试了很多找到的解决方案之后,如果我将部分标题高度删除为UITableViewAutomaticDimension,那么从UITableView添加和删除行就能完美地工作,并且表视图也固定在相同的位置。
tableView.sectionHeaderHeight = 10;
tableView.estimatedSectionHeaderHeight = UITableViewAutomaticDimension;
如果添加,请删除2行以上。
tableView.estimatedRowHeight = 15;
tableView.rowHeight = UITableViewAutomaticDimension;*
自动维度行不会产生任何问题。
但使用自动维度的部分标题视图会产生问题。
感谢。
答案 1 :(得分:0)
这是UITableViews的一个已知错误,它已经存在很长时间并且没有得到修复(从它的外观来看,它永远不会)。
这是因为您的单元格是动态大小的(我假设)您使用的是默认的“UITableViewAutomaticDimension”。要解决此问题,您需要放弃使用'UITableViewAutomaticDimension'并计算每个单元格的大小。这应该有助于表视图的弹性,但可能不会是完美的。
另一种方法是依赖CATransaction来锁定并保持插入后的表视图位置。
它应该看起来像这样(可能,我没有测试它):
CGFloat offset = self.tableView.contentSize.height - self.tableView.contentOffset.y;
[CATransaction begin];
[CATransaction setDisableActions:YES];
[CATransaction setCompletionBlock: ^{
// Code to be executed upon completion
}];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths: indexPaths
withRowAnimation: UITableViewRowAnimationAutomatic];
self.tableView.contentOffset = CGPointMake(0,
self.tableView.contentSize.height - bottomOffset);
[self.tableView endUpdates];
[CATransaction commit];