因此,我們的目標是以插入和定位內容的方式,使所有插入的行都可見。只要插入的行比表本身更短,這是可行的。
似乎滾動動畫和插入互相干擾。要解決,我們首先要做的滾動,因爲文檔提供了當動畫完成,即透明鉤,委託方法- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
該解決方案會去是這樣的:
// about to insert cells at arCells index paths
// first scroll so that the top is visible
NSIndexPath *firstNewIndexPath = [arCells objectAtIndex:0];
NSInteger previousRow = MAX(firstNewIndexPath.row-1, 0);
NSIndexPath *previousIndexPath = [NSIndexPath indexPathForRow:previousRow inSection:firstNewIndexPath.section];
// if the new rows are at the bottom, adjust the content inset so the scrolling can happen
if (firstNewIndexPath.row > [self.tableView numberOfRowsInSection:0) {
self.tableView.contentInset = UIEdgeInsetsMake(0, 0, self.tableView.frame.size.height - 80, 0); // 80 is just to illustrate, get a better row height from the table
}
[self.tableView scrollToRowAtIndexPath:previousIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
// there may be a better way to setup that scroll, not sure, but that should work.
現在我們有一個知道動畫完成的鉤子。我們可以放心地做插入...
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
// hopefully you have those arCells in an instance variable already, otherwise
// i think you'll need to create one to save state in between the two animations
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:arCells withRowAnimation:UITableViewRowAnimationLeft];
[self.tableView endUpdates];
// restore the content inset
self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
}
一對夫婦的其他SO articles like this one處理得到一個鉤來告訴我們的行動畫完成。這可能會更好,因爲那麼我們就有更好的想法在哪裏滾動(如你的問題所示,到新插入行的底部)。但是這些都不能讓我們知道動畫已經完成。
只是一個預感:你可以嘗試註釋scrollToRow,看看是否行爲相同的方式? – danh
是的,我評論和測試。那時候,當我在最後一個單元格後面插入5行時,我看不到動畫。可見的行正確獲取動畫。 – Dev
對,所以我認爲這是預期的行爲。我認爲問題在於我們將兩個動畫放在一起影響相同的東西。這是一個競賽條件。讓我檢查文檔,看看是否有一個鉤子,告訴你插入動畫已完成,然後我們可以開始滾動 – danh