【发布时间】:2014-10-03 19:10:31
【问题描述】:
我有一个数组,集合视图在创建单元格时使用数组中的数据。当我的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 没有改变,并且新的第 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;
}];
}
}
似乎工作得很好,但是在执行批处理时我有点卡住,有什么办法可以避免这种情况吗?
【问题讨论】:
-
您的问题解决了吗?我也面临同样的问题。
标签: ios objective-c uitableview uiscrollview uicollectionview