好的,所以我需要的是防止在當前可見行上方添加新元素時進行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