好的,所以我需要的是防止在当前可见行上方添加新元素时进行tableview滚动。我使用了NSFetchedResultsController和很多对象(比如10 000),并且当我没有碰到contentOffset时,reloadData工作的非常流畅。当在顶部添加单元格时,使UITableView保持滚动位置
但是,当我试图操纵contentOffset保持滚动位置插入新条目时,它开始冻结用户界面像300毫秒这对我不利。
任何人都可以提出任何更好(更快)的解决方案,当在顶部添加新项目时,如何在同一个单元格中保留tableview?
这是我目前使用的代码来跟踪插入和移动contentOffset。它不支持动画和不同的单元大小。
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
switch(type) {
case NSFetchedResultsChangeInsert:
[_insertions addObject:@(newIndexPath.row)];
break;
}
}
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
_insertions = @[].mutableCopy;
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
NSMutableArray *copy = _insertions.mutableCopy;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSSortDescriptor *lowestToHighest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES];
[copy sortUsingDescriptors:[NSArray arrayWithObject:lowestToHighest]];
dispatch_sync(dispatch_get_main_queue(), ^{
for (NSNumber *i in copy) {
[self p_delayedAddRowAtIndex:[i integerValue]];
}
[self.tableView reloadData];
});
});
}
- (CGFloat)p_firstRowHeight {
return [self tableView:[self tableView] heightForRowAtIndexPath:[NSIndexPath indexPathForRow:0
inSection:0]];
}
-(void)p_delayedAddRowAtIndex:(NSInteger)row {
NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] firstObject];
if (firstVisibleIndexPath.row >= row) {
CGPoint offset = [[self tableView] contentOffset];
offset.y += [self firstRowHeight];
if ([self.tableView visibleCells].count > self.tableView.frame.size.height/[self firstRowHeight]) {
[[self tableView] setContentOffset:offset];
}
}
}
这个工作:快照'controllerWillChangeContent'中的'firstVisibleIndexPath'。在'didChangeObject'中,保留在firstVisibleIndexPath之前插入了多少行的计数。然后在'controllerDidChangeContent'中,计算新行(通过添加count),重新加载tableView,然后'scrollToRowAtIndexPath'到新的indexPath。 – pbasdf 2014-11-22 12:11:44
确保您的估计单元格大小未设置 – 2015-02-03 17:51:33