我读过很多关于 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)
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。
希望这对您有帮助...
请参考我的图片