分页显示UICollectionView的正确方法

问题描述 投票:0回答:1

我读过很多关于 UICollectionView 与分页的 SO 解决方案。我自己也使用这些解决方案:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat pageWidth = self.collectionView.frame.size.width;
    self.lbPaging.text = [NSString stringWithFormat:@"%d/%d", self.collectionView.contentOffset.x / pageWidth, totalPage];
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    CGFloat pageWidth = self.collectionView.frame.size.width;
    self.lbPaging.text = [NSString stringWithFormat:@"%d/%d", self.collectionView.contentOffset.x / pageWidth, totalPage];
}

是的,大多数时候这个工作正常。但现在我经历了一些意想不到的事情:

当用户滚动速度足够快时,会超过上面的方法,这可能会导致分页故障(例如最后一页显示 15/13,或者即使是第一页也显示 3/5)。

对于我们开发人员或测试人员来说,要重现此错误,请将手指触摸滚动视图并开始滚动。当您快要超出边缘时(通常您会松开手指),触摸边缘的另一侧并继续滚动。在真实设备上重现更容易。

所以我问是否有人知道显示页面导航的正确方法?好吧,没有 UIPageViewController (我想显示数字页面,而不是点)。

编辑

我不知道这个问题是否严重,但我想也许是,因为我在滚动到下一页时正在执行加载数据。最近,我在这方面崩溃了(真的很难调试,比如在哪一步崩溃了):

    [self.collectionView performBatchUpdates:^{
        NSMutableArray *arrayWithIndexPaths = [NSMutableArray array];
        for (NSInteger index = 0; index < next2page.count; index++ ) {
            [arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:(index + offset) inSection:0]];
        }
        [self.collectionView insertItemsAtIndexPaths:arrayWithIndexPaths];
    } completion:nil];

异常是这样的:无法将项目插入第0节中的索引路径(只有69行,插入到indexPath:73)

ios objective-c pagination uicollectionview uiscrollview
1个回答
2
投票
hello i have create button in UICollectionView like load more data and function is given below:-

- (void)viewDidLoad {

  //declare page inedex initial base 0.
  self.pageIndex = 0;

  [self loadMoreData];
}

在您调用加载更多数据功能后,页面索引会增加,我希望我的页面索引像0,20,40,所以我创建了self.pageIndex+= 20,您可以根据您的需要进行更改

-(void)loadMoreData
{

self.isFromMoreData = TRUE;

self.pageIndex+= 20;

NSLog(@"loadMoreData %d and self.index %d",self.pageIndex,self.index);

[self loadDataIntoCollectionView];//this function calls api 
}

********************下面给出另一种方法**************************** *****

使用 UIRefreshControl。

 UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];

    refreshControl = refreshControl;

   refreshControl.backgroundColor = [UIColor whiteColor];
   refreshControl.tintColor = [UIColor grayColor];
   [refreshControl addTarget:self action:@selector(loadMoreData)  forControlEvents:UIControlEventValueChanged];

self.myCollectionView.pagingEnabled = YES;
[self.myCollectionView addSubview:refreshControl];
self.myCollectionView.alwaysBounceVertical = YES;

并调用我上面声明的相同函数 loadMoreData。

希望这对您有帮助...

请参考我的图片

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.