在滚动到顶部时在表视图的开始处动态添加行
我有一个数组,集合视图在创建单元格时使用数组中的数据。我在数组的开头添加一些对象,当我的collectionview几乎在顶部。我使用这种方法来确定其时间来加载新项目&部分并添加他们在滚动到顶部时在表视图的开始处动态添加行
-(void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section < sectionLimitBeforeLoadingMoreSections)
{
// add some objects at the beginning of the array
}
}
,但我可以很容易地使用其他方法(即scrollViewDidScroll)。
所以我有一个问题,当我将项目添加到数组和reloadData中时,我的集合视图contentOffset不会被更改,因此一旦调用此方法,它会越来越多地被调用,并使得CPU无限工作@ 100%。
例如:我有20个部分,初始位置是中心部分(10)。我开始滚动到顶部,当我到达第4部分时,还有10个项目被添加到数组中(这意味着将出现10个部分)。所以第4节现在必须成为第14节。所以它确实如此,但我的scrollView contentOffset不会改变,并且新的Section 4立即可见,因此它再次调用此方法以添加10个项目等等。
当我使用此方法在数组末尾添加对象时,它工作正常。部分添加在底部,我滚动得很好。
我想到了一个解决方案来确定所有添加的新节的高度,并将此值添加到当前的contentOffset,但我看不出如何计算高度。
更新:
if(indexPath.section < sectionLimitBeforeLoadingMoreSections) // load @ beginning
{
if(!self.isLoading)
{
self.isLoading = YES;
CGFloat height = self.contentSize.height;
[self performBatchUpdates:^
{
[self loadNewMonthsAtTheBeginning:10];
[self insertSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 10)]];
}
completion:^(BOOL finished)
{
self.contentOffset = CGPointMake(self.contentOffset.x,self.contentOffset.y + self.contentSize.height - height);
self.isLoading = NO;
}];
}
}
似乎运作良好,但我得到一点点冻结执行批处理时,没有办法避免这种情况?
如果你得到一个冻结,那么我会假设loadNewMonthsAtTheBeginning在主线程上使用了太多的处理时间,你应该考虑在另一个线程中执行那里完成的工作。
如果它是一个网络连接,可以考虑使用异步调用,如这里提到:how to send Asynchronous URL Request?
否则,你可以使用GCD
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// Code run on non UI thread to perform tasks such as loadNewMonthsAtTheBeginning
dispatch_async(dispatch_get_main_queue(), ^{
// UI thread to perform insertSections
});
});
我试过调度,没成功。同样的方法,它将数据添加到数组的末尾(例如,在收集视图的末尾添加部分)工作正常:( 我想它并没有真正冻结,但是因为我在插入新节后设置了内容偏移量,它会滚动回到原来的位置,它看起来像冻结。 – t0a0 2014-10-03 20:51:39
你解决问题了吗?我面对同一个。 – 2015-07-14 21:26:11