UICollectionView分页 - 如何获取最后一个可见单元

时间:2015-11-17 14:41:21

标签: ios objective-c iphone

我有一个UICollectionView,每行包含2个单元格。现在,我需要启用分页,当UICollectionView的最后一个单元出现时,我需要获取另一组记录。我怎样才能完成这件事。

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

        MyCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cc" forIndexPath:indexPath];

            if (indexPath.row == [mydictionary count]) {
                pg = pg +1;

               [self loadtheservice:pg];

            }


return cell;
}

根据我上面的代码,[self loadtheservice:pg]被多次调用。我认为原因是最后一个单元格长visiblecellForItemAtIndexPath正在调用加载服务方法。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以使用willDisplayCell方法检查iOS8中可用的条件

- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath

Bellow IOS8: 一般我们使用以下。是的它会调用每个卷轴末端,因此可能不是首选。

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

因此,如果您不想要,您可以使用UICollectionViewDelegateFlowLayout委托来管理它。我给出了粗略的想法。您可以根据您的要求实施。使用以下,

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section
    {
        if(paging does not complete ) {
            // you can give some nice gui to load more to notify user. if you dont want to notify user, just return with 1px height size 
          } else {
              return zero size 
          }   
     }

您可以通过以下分组管理该视图

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
   if(kind == UICollectionElementKindSectionFooter) {
     // here you can add your nice load more functionality with some custom view . if you dont need load more view, you can add 1px height footer view and manage that if paging completed 
   }
}

答案 1 :(得分:0)

使用willDisplayCell方法检查iOS8中可用的条件

- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath

对于iOS8以下版本,您需要在scrollViewDidEndDecelerating方法上检查条件,如下所示

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    float bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height;
        if (bottomEdge >= self.collectionView.collectionViewLayout.collectionViewContentSize.height) {
           //here call API to load next page records
        }

}