在滚动到顶部时在表视图的开始处动态添加行

在滚动到顶部时在表视图的开始处动态添加行

问题描述:

我有一个数组,集合视图在创建单元格时使用数组中的数据。我在数组的开头添加一些对象,当我的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; 
      }]; 
     } 
    } 

似乎运作良好,但我得到一点点冻结执行批处理时,没有办法避免这种情况?

+0

你解决问题了吗?我面对同一个。 – 2015-07-14 21:26:11

如果你得到一个冻结,那么我会假设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 
    }); 
}); 
+0

我试过调度,没成功。同样的方法,它将数据添加到数组的末尾(例如,在收集视图的末尾添加部分)工作正常:( 我想它并没有真正冻结,但是因为我在插入新节后设置了内容偏移量,它会滚动回到原来的位置,它看起来像冻结。 – t0a0 2014-10-03 20:51:39